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 clazzType不支持generics)。

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

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

     this.fromJson( jsonData, (Type)clazz ); 

    请注意,这里需要this ,因为fromJson()本身就是非法语法。

  2. 使用注释@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位。