2 Replies Latest reply on Dec 19, 2016 6:21 AM by nuno.godinhomatos

    Doubt about Spec Section 5.2.4. Assignability of raw and parameterized types - On injection point without diamond operator




      I have doubt about the following spec section:



      I am trying to understand what paragraph in the spec explains the reason why a parameterized bean would not be injectable into a raw type delcared injection point.

      From what I understand in CDI 1.0 weld se core final, there was an implementation bug that has since been fixed, whereby the following type of injection would work:

      @ Inject

      Instance<Dao> allDaos;


      Now Dao, is a paremeterized interface.

      And in CDI 1.1 weld 2.3.2 final, the code to be made to work would need to fix the injection point to read as follows:

      Instance<Dao<?>> allDaos;


      So, one would jave to declare that he wants to inject a Dao where the type parameter is unbounded / wild carded.


      Of course, the Dao class could be for example a

      public interface Dao<T>{



      The problem of course, is that as I try to upgrade, I am encountering some runtime blowups where essentially instances that used to be made accessible from injection points that were not using the diamon wild card fail.

      This is fine, I will fix those ... I do need to spot them all... but life is like that. Mistakes have a price.


      But in any case, i would like to see in the spec document the phrase that states that a class.

      public class UserDao implements Dao<User>{



      Is not assignable to the injection point Instance<Dao>.


      I suspect the phrase is htis one:

      "A parameterized bean type is considered assignable to a raw required type if the raw types are identical and all type parameters of the bean type are either unbounded type variables or java.lang.Object."

      In this case:

      A A parameterized bean type


      is considered assignbale to a raw requred type

      @ Inject

      Instance<Dao> allDaos;



      if the raw types


      and all type parameters of the bean type


      either unbounded type

      (it is not the case right it is bounded to "User")

      or "java.lang.Object".


      But I am not sure 100% that my interepretaiton is corect.

      If it is, this means that to the old injection point only a class of the form:

      UnAssigninedDao <T> extends Dao<T>{



      Or a class

      ObjectDao  extends Dao<Object>{



      would be legal candaidates to the injection point above?


      Thanks for the clarification, this is discovery is an unfortunate setback... that is blowing up in my face in runtime testing.