Почему компилятор заявляет, что не существует уникального максимального экземпляра?

У меня есть следующие классы:

public class Obj 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 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;
  }
}

Когда я компилирую, я получаю следующую ошибку:

параметры типа X не могут быть определены; не существует уникального максимального экземпляра для переменной типа X с верхними границами T, java.lang.Object -> getObject ()

Этого не происходит в Eclipse, который, насколько я могу судить, использует тот же JDK, что и мой Ant build. Я видел ветку SO о проблеме компилятора Sun , но, похоже, это касается статических методов, объявляющих типы на лету.

Почему я получаю эту ошибку и, что более важно, как ее обойти?

Пока что я нашел единственную причину, по которой я использовал свой метод следующим образом:

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

Сказать мне, что я нахожусь на грани отказа, и это правильный способ, приемлемо.

26
задан Community 23 May 2017 в 12:16
поделиться