javagenerics

Java generics: What is the compiler's issue here? ("no unique maximal instance")


I have the following methods:

public <T> T fromJson( Reader jsonData, Class<T> clazz ) {
    return fromJson( jsonData, (Type)clazz );
}

public <T> T fromJson( Reader jsonData, Type clazz ) {
    ...
}

The compiler is saying about the first method:

 type parameters of <T>T cannot be determined;
 no unique maximal instance exists for type variable T
 with upper bounds T,java.lang.Object

 return fromJson( jsonData, (Type)clazz );
                ^

What is the problem?


Solution

  • The problem is the definition of the second method:

    public <T> T fromJson( Reader jsonData, Type clazz ) {
    

    There is no way for the compiler to tell what type T might have. You must return Object here because you can't use Type<T> clazz (Type doesn't support generics).

    This leads to a cast (T) in the first method which will cause a warning. To get rid of that warning, you have two options:

    1. Tell the compiler the type. Use this (odd) syntax:

      this.<T>fromJson( jsonData, (Type)clazz );
      

      Note that you need the this here because <T>fromJson() alone is illegal syntax.

    2. Use the annotation @SuppressWarnings("unchecked").