Javagenerics:这里的编译器问题是什么? (“没有唯一的最大实例”)
我有以下方法:
public T fromJson( Reader jsonData, Class clazz ) { return fromJson( jsonData, (Type)clazz ); } public T fromJson( Reader jsonData, Type clazz ) { ... }
编译器说的是第一种方法:
type parameters of 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 ); ^
问题是什么?
问题是第二种方法的定义:
public T fromJson( Reader jsonData, Type clazz ) {
编译器无法确定T
可能具有的类型。 您必须在此处返回Object
,因为您无法使用Type
( Type
不支持generics)。
这导致第一种方法中的强制转换(T)
会引起警告。 要摆脱这种警告,您有两种选择:
-
告诉编译器类型。 使用这个(奇数)语法:
this.
fromJson( jsonData, (Type)clazz ); 请注意,这里需要
this
,因为
本身就是非法语法。fromJson() -
使用注释
@SuppressWarnings("unchecked")
。
我遇到了同样的问题,发现它是JDK中的一个错误( #6302954 )。 它固定在jdk 6u25。
我解决了这个问题的一个实例,但决定更新CI框上的JDK版本。
这似乎是推理的失败。 第一种方法显然打算调用第二种方法,类型参数与它具有的类型参数T
相同。 但是编译器可能无法解决这个问题,因为它的推理系统还不够好。
在任何情况下,您应该能够显式指定类型参数,它应该摆脱错误:
public T fromJson( Reader jsonData, Class clazz ) { return this. fromJson( jsonData, (Type)clazz ); }
我在NetBeans中编译时遇到了类似的问题。 我所要做的就是在设置>编译> Java平台中将JDK版本从16位更改为32位。