代码之家  ›  专栏  ›  技术社区  ›  Epaga Alex Reynolds

Java泛型:编译器的问题是什么无唯一实例“)

  •  10
  • Epaga Alex Reynolds  · 技术社区  · 16 年前

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

    4 回复  |  直到 16 年前
        1
  •  16
  •   Aaron Digulla    13 年前

    问题在于第二种方法的定义:

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

    编译器无法判断是什么类型 T 可能有。你必须回来 Object Type<T> clazz Type

    这将导致一个演员阵容 (T) 在第一种方法中,它将引起警告。要消除该警告,您有两种选择:

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

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

      this 在这里是因为 <T>fromJson() 单独使用是非法语法。

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

        2
  •  13
  •   Peter L    13 年前

    我遇到了同样的问题,并发现这是一个错误( #6302954 )在JDK中。它是在jdk6u25中修复的。

        3
  •  2
  •   newacct    13 年前

    这似乎是推理的失败。第一个方法显然打算调用类型参数为同一类型参数的第二个方法 T

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

    public <T> T fromJson( Reader jsonData, Class<T> clazz ) {
        return this.<T>fromJson( jsonData, (Type)clazz );
    }
    
        4
  •  1
  •   Nigel Thomas    13 年前

    我在用NetBeans编译时也遇到了类似的问题。 我只需在设置中将JDK版本从16位更改为32位>编译>Java平台。