Java泛型:这里的编译器问题是什么?("没有唯一的最大实例")

Epa*_*aga 10 java compiler-construction generics

我有以下方法:

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

public <T> T fromJson( Reader jsonData, Type clazz ) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

编译器说的是第一种方法:

 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 );
                ^
Run Code Online (Sandbox Code Playgroud)

问题是什么?

Aar*_*lla 16

问题是第二种方法的定义:

public <T> T fromJson( Reader jsonData, Type clazz ) {
Run Code Online (Sandbox Code Playgroud)

编译器无法确定T可能具有的类型.您必须返回Object此处,因为您无法使用Type<T> clazz(Type不支持泛型).

这导致(T)第一种方法中的强制转换会引起警告.要摆脱这种警告,您有两种选择:

  1. 告诉编译器类型.使用这个(奇数)语法:

    this.<T>fromJson( jsonData, (Type)clazz );
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,您需要this这里,因为<T>fromJson()单独是非法语法.

  2. 使用注释@SuppressWarnings("unchecked").


Pet*_*r L 13

我遇到了同样的问题,发现它是JDK中的一个错误(#6302954).它被修复在jdk 6u25.

我解决了这个问题的一个实例,但决定更新CI盒子上的JDK版本.