java - 为什么编译器声明不存在唯一的最大实例?

标签 java generics compiler-construction compiler-errors javac

我有以下类(class):

public class Obj<T> extends BaseModel {

    public static final String OBJECT = "object";

    public Obj(T object) {
        setObject(object);
    }

    public T getObject() {
        return get(OBJECT);
    }

    public void setObject(T object) {
        set(OBJECT, object);
    }
}

还有……

/** This is a 3rd party library class **/
public class BaseModel implements ModelData, Serializable {
  //...members and stuff...

  @SuppressWarnings({"unchecked", "rawtypes"})
  public <X> X get(String property) {
    X obj = null;
    if (start > -1 && end > -1) {
      Object o = map.get(property.substring(0, start));
      String p = property.substring(start + 1, end);
      if (o instanceof Object[]) {
        obj = (X) ((Object[]) o)[Integer.valueOf(p)];
      } else if (o instanceof List) {
        obj = (X) ((List) o).get(Integer.valueOf(p));
      } else if (o instanceof Map) {
        obj = (X) ((Map) o).get(p);
      }
    } else {
      obj = (X) map.get(property);
    }
    return obj;
  }
}

编译时出现以下错误。

type parameters of <X>X cannot be determined; no unique maximal instance exists for type variable X with upper bounds T,java.lang.Object -> getObject()

在 Eclipse 中不会发生这种情况,据我所知,它使用与我的 Ant 构建相同的 JDK。我看过SO thread about the Sun compiler issue ,但这似乎是用于动态声明类型的静态方法。

为什么我会收到此错误,更重要的是,我该如何解决?

到目前为止,我发现的唯一原因是像这样输入我的方法:

@SuppressWarnings({"unchecked"})
public T getObject() {
    return (T) get(OBJECT); //yuck
}

告诉我我正在崩溃,这是正确的方法是可以接受的。

最佳答案

这是假的bug已在 Java SE 7 中修复。

关于java - 为什么编译器声明不存在唯一的最大实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5666027/

相关文章:

java - 在字符串中搜索大写字母

c# - 关于通用类的Unity 2.0 IOC配置

c - C 编译器使用的数据布局(对齐概念)

c++ - 我需要做什么才能通过仅在我的 unix 系统上输入名称来运行我的 C++ 程序

java - 具有纯 JDBC-JNDI :javax. naming.NameNotFoundException : Name [jdbc/KDB] is not bound in this Context. 无法找到 [jdbc] 的 Tomcat 8.5

java - 字段 component.x 不可见

java - collections.sort 来定义两个元素的排序顺序?

c# - 指定返回类型

generics - 使用记录 Haskell 进行泛型派生

c++ - 为什么函数参数名称在 C++ 声明中不重要?