[ https://issues.apache.org/jira/browse/OWB-431?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12893717#action_12893717 ]
Eric Covener commented on OWB-431: ---------------------------------- IMHO the spec could only have meant "assignable from" and not "assignable to". That would stop us from inverting the two types in question in our comparison: If a producer produces "T extends Pet" (upper bound of "Pet") ... and Pet extends Animal ... and Dog extends Pet. Consider injection points: @Inject @Default Dog d; @Inject @Default Animal a; When the spec says "actual type is assignable to the upper bound" I think they MUST have intended "actual type is assignable _from_ the upper bound" I assume everyone agrees that the Animal injection is satisfiable (we can produce a Pet, which is an Animal) and the Dog injection is not satisfiable: Since the spec says "actual type (Dog or Animal) is assignable _to_ the upper bound (Pet)" we reverse the arguments: if (!Pet.isAssignableFrom(Dog)) { // wrong result, our code expects to call dog.bark() but we're just producing a Pet! return false; } if (!Pet.isAssignableFrom(Animal)) { // wrong result, Pet clearly fulfills the injection point of Animal return false; } But the real test for the injection point being satisfied should not be reversed: if (!Dog.isAssignableFrom(Pet)) { // we can't inject a pet into a field that wants a dog return false; } if (!Animal.isAssignableFrom(Pet)) { // return false; } > Generic Type Inheritance not resolved correctly > ----------------------------------------------- > > Key: OWB-431 > URL: https://issues.apache.org/jira/browse/OWB-431 > Project: OpenWebBeans > Issue Type: Bug > Components: Injection and Lookup > Affects Versions: 1.0.0-alpha-1 > Environment: standard OWB configuration > Reporter: Bill Wigger > Assignee: Gurkan Erdogdu > Priority: Minor > Fix For: 1.0.0-alpha-2 > > Attachments: ClassUtilPatch.txt, ClassUtilPatch2.txt > > Original Estimate: 2h > Remaining Estimate: 2h > > WebBean is defined as: > @Named > public class MethodTypeProduces1<T extends Bc> { > @Produces @Dependent @Named("ProMethodParameterized3") ArrayList<T> > methodPT3() { > and injected as: > @Named > @Dependent > public class ProMethodTestGroup3A { > public @Inject @Dependent @Named("ProMethodParameterized3") > ArrayList<Dc> pt3; > > with BC extending DC as follows: > public class Bc extends Dc implements Fi { > gives this error: > Jul 28, 2010 9:26:51 AM org.apache.webbeans.config.BeansDeployer deploy > SEVERE: > Throwable occurred: javax.enterprise.inject.UnsatisfiedResolutionException: > Api type [java.util.ArrayList] is not found with the qualifiers > [...@javax.inject.named(value=ProMethodParameterized3)] for injection into > Field Injection Point, field name : pt3, Bean Owner : > [Name:proMethodTestGroup3A,WebBeans Type:MANAGED,API > Types:[com.ibm.jcdi.test.ProMethodTestGroup3A,java.lang.Object],Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default,javax.inject.Named]] > at > org.apache.webbeans.container.ResolutionUtil.checkResolvedBeans(ResolutionUtil.java:121) > at > org.apache.webbeans.container.InjectionResolver.checkInjectionPoints(InjectionResolver.java:185) > at > org.apache.webbeans.container.BeanManagerImpl.validate(BeanManagerImpl.java:1025) > injection should be checked/resolved here in > org.apache.webbeans.util.ClassUtil, but this method returns false > public static boolean checkRequiredTypeIsClassAndBeanTypeIsVariable(Type > beanTypeArg, Type requiredTypeArg) > { > Class<?> clazzRequiredType = (Class<?>)requiredTypeArg; > TypeVariable<?> tvBeanTypeArg = (TypeVariable<?>)beanTypeArg; > Type tvBound = tvBeanTypeArg.getBounds()[0]; > if(tvBound instanceof Class) > { > Class<?> clazzTvBound = (Class<?>)tvBound; > if(clazzTvBound != Object.class) > { > if(!clazzTvBound.isAssignableFrom(clazzRequiredType)) > { > return false; > } > } > } > return true; > } > But since clazzTvBound is Bc and classRequiredType is Dc > Bc.isAssignableFrom(Dc) returns false, so the ! is true, and the function > returns false. > fix seems to simply go back to the old code in this routine, this code was > changeed on 4/28, and > I can't see why is was changed. > But the check needs to verify that the required class can be assigned from > the given bean class, as follows: > if(tvBound instanceof Class) > { > Class<?> clazzTvBound = (Class<?>)tvBound; > if(clazzRequiredType.isAssignableFrom(clazzTvBound)) > { > return true; > } > } > return false; > There is also a similar incorrect injection exception using the above > example, but with an injection of: > public class TG4 <T extends Dc> { > public @Inject @Dependent @Named("ProMethodParameterized3") > ArrayList<T> ptT; > I think the line of code in error here is in the method: > (same class as in the previous problem: org.apache.webbeans.util.ClassUtil) > public static boolean checkBeanTypeAndRequiredIsTypeVariable(Type > beanTypeArg, Type requiredTypeArg) > where: > if(clazzTvBeanBound.isAssignableFrom(clazzTvRequiredBound)) > should be replaced with: > (clazzTvRequiredBound.isAssignableFrom(clazzTvBeanBound)) -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.