Anyway,
I took a look into the CDI 1.1 TCK, which has a quite interesting
deployment scenario with generics:
public class Baz<T> {
}
public class Qux extends Baz<String> {
}
@Vetoed
public class Bar<T1, T2> {
@Inject
private Baz<T1> baz;
@Inject
private Baz<List<T2>> t2BazList;
}
@RequestScoped
public class Foo extends Bar<String, Qux> {
}
public class Producer {
@Produces
@Amazing
public String produceString() {
return "ok";
}
@Produces
public String[] produceStringArray() {
return new String[0];
}
@Produces
public Baz<Baz<Qux>> produceBazBazQux() {
return new Baz();
}
}
The class Bar has some more injection points, but that does not matter.
Due to the TCK this deployment should work, but I don't know how.
Question (it is basically the question we are discussing here): Is Baz a
Bean (I suppose so) and may it be injected into the second injection point
of Bean Foo in class Bar?
- If yes, it also should be injected into the first injection point,
right? This would lead to an AmbiguousResolutionException since Qux could
also be injected into the first injection point.
- If no, the deployment should fail with a UnsatisfiedResolutionException
since there is no Bean that can be injected into that injection point.
WDYT?
If noone can shed light into this, I will cross-post this mail to the
cdi-dev list.
Cheers,
Arne
Am 06.07.13 19:00 schrieb "Mark Struberg" unter <[email protected]>:
>I thought about this a bit now. This is a bit of a mixed bag.
>
>Another pov is:
>
>ArrayList<T> which gets erased to ArrayList<Object> should be treated as
>ArrayList.
>
>Now for the question: does a Producer for ArrayList also get used for an
>InjectionPoint of ArrayList<String>?
>In CDI 1.0 only the other way around was specified. We had this
>discussion with the Weld guys and also had this code in some CDI
>Extensions.
>
>Not an easy topic indeed.
>
>LieGrue,
>strub
>
>
>
>
>----- Original Message -----
>From: Arne Limburg <[email protected]>
>To: "[email protected]" <[email protected]>
>Cc:
>Sent: Saturday, 6 July 2013, 10:18
>Subject: Re: OWB and generics
>
>Forgot to mention that T is an unbound type variable at class level:
>
>
>public class MethodTypeProduces1<T>
>
>and there is no subclass of MethodTypeProduces1
>
>
>Am 06.07.13 10:12 schrieb "Romain Manni-Bucau" unter
><[email protected]>:
>
>>Wait, not sure google ate a part of the code or not but if a <T> then T
>>can
>>be String (like ArrayList itself)
>>Le 6 juil. 2013 09:18, "Arne Limburg" <[email protected]> a
>>écrit :
>>
>>> Hi,
>>>
>>> I am currently struggling with the handling of generics in OWB, because
>>> CDI 1.1 TCK requires us to be much more clever than we are now in this
>>>area.
>>> However I stumbled about a test in our test-suite that seems to be
>>>wrong
>>> to me, but I would like to have another opinion.
>>> With my local implementation of the generic handling (which is much
>>>better
>>> than the one in trunk) the following tests fails:
>>> MethodProducer1Test.testPersonProducer
>>>
>>> Basically it tests if an ArrayList with an unbound type variable is
>>> injectable into an injection point of type ArrayList<String>:
>>>
>>> @Produces @Dependent @Named("ProMethodParameterized3")
>>>
>>> ArrayList<T> methodPT3() {...}
>>>
>>> and
>>>
>>> @Inject ArrayList<String> pt3;
>>>
>>> Reading 5.2.4 of the CDI 1.1 spec (the fourth bullet point) I would
>>> suggest that this should lead to an error since String is not
>>>assignable
>>> from Object (which is the upper bound of T).
>>>
>>>
>>> WDYT?
>>>
>>>
>>> Cheers,
>>>
>>> Arne
>>>
>