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

Java泛型:什么是编译器';这里有什么问题?(“无唯一最大实例”),java,generics,compiler-construction,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 ) { ... } public T fromJson(读取器jsonData,类clazz){ 从json(jsonD

我有以下方法:

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

public <T> T fromJson( Reader jsonData, Type clazz ) {
    ...
}
public T fromJson(读取器jsonData,类clazz){
从json(jsonData,(Type)clazz)返回;
}
public T fromJson(读取器jsonData,类型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 );
                ^
无法确定T的类型参数;
类型变量T不存在唯一的最大实例
上界为T,java.lang.Object
从json(jsonData,(Type)clazz)返回;
^

问题是什么?

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

public <T> T fromJson( Reader jsonData, Type clazz ) {
请注意,此处需要
this
,因为
fromJson()
本身就是非法语法

  • 使用注释
    @SuppressWarnings(“未选中”)


  • 我遇到了同样的问题,发现这是JDK中的一个bug()。它是在jdk 6u25中修复的


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

    这似乎是推理失败。第一个方法显然打算调用第二个方法,其类型参数与它拥有的类型参数
    T
    相同。但可能编译器无法理解它,因为它的推理系统不够好

    在任何情况下,您都应该能够显式指定类型参数,并且应该消除错误:

    public <T> T fromJson( Reader jsonData, Class<T> clazz ) {
        return this.<T>fromJson( jsonData, (Type)clazz );
    }
    
    public T fromJson(读取器jsonData,类clazz){
    返回这个.fromJson(jsonData,(Type)clazz);
    }
    
    在使用NetBeans编译时,我也遇到了类似的问题。
    我所要做的就是在“设置”>“编译”>“Java平台”中将JDK版本从16位更改为32位。

    这个答案不正确。虽然第二个方法的实现可能不是类型安全的(我们在这里看不到实现),但是第二个方法的声明在技术上没有任何错误。我不是这么说的。我的参数是
    Type
    没有泛型参数,因此投射将编译器应该使用的
    Class
    中的
    T
    隐藏起来,从而产生错误。但是您可以用
    this.
    告诉编译器类型,这是正确的。我改进了我的答案。问题是JDK中的一个bug,修复在JDK 6u25上。@OmarHrynkiewicz:我对Peter的答案投了赞成票。我不知道怎样才能提高我的水平。
    public <T> T fromJson( Reader jsonData, Class<T> clazz ) {
        return this.<T>fromJson( jsonData, (Type)clazz );
    }