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

时间:2010-03-12 08:25:51

标签: java generics compiler-construction

我有以下方法:

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

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

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

 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 );
                ^

有什么问题?

3 个答案:

答案 0 :(得分:16)

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

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

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

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

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

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

    请注意,您需要this,因为仅<T>fromJson()是非法语法。

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

答案 1 :(得分:13)

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

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

答案 2 :(得分:1)

我在NetBeans中编译时也遇到了类似的问题。 我所要做的就是在设置&gt;中将JDK版本从16位更改为32位。编译&gt; Java平台。