Путаница в отношении общих ограниченных типов подстановочных знаков - PullRequest
1 голос
/ 28 декабря 2011

Довольно тривиальный вопрос Java.В этом коде есть ошибка:

public abstract class SubTypeDependentEditor<T> implements Editor<T> {
  protected abstract Editor<? extends T> getEditorFor(T obj);       

  public void edit(T obj) {
    Editor<? extends T> editor = getEditorFor(obj);
    editor.edit(obj); // ERROR IS HERE
  }
}

Как правильно ее исправить?

Идея T в основном является просто типом корня иерархии классов, поэтому с учетом такой иерархии:

class Entity {}
class EntityA extends Entity {}
class EntityB extends Entity {}

один будет иметь T, установленный на Entityи getEditorFor(T obj) отвечает за возврат Editor<X>, где X зависит от конкретного типа obj и всегда является Is-A T.Итак, если у вас есть SubTypeDependentEditor<Entity>, getEditorFor(T obj) возвращает Editor<EntityA>, когда obj равно EntityA и Editor<EntityB>, когда obj равно EntityB.

Любой шанс, что это может быть реализовано безпредупреждения?

Обновление:

protected abstract Editor<? extends T> getEditorFor(T obj);     

В принципе может иметь любую другую сигнатуру, но код, который реализует этот код, имеет только объекты, которые Editor<X>, поэтому в случае, если этот метод возвращает Editor<T> Я не уверен, как реализовать getEditorFor(T obj).

1 Ответ

4 голосов
/ 28 декабря 2011
protected abstract Editor<? extends T> getEditorFor(T obj);

означает, что getEditorFor() возвращает редактор для неизвестного подтипа T.

Вы не можете передать использование любого значения типа T с этим результатом, так как компилятор не может доказатьobj работает с тем же конкретным подтипом T, что и тип obj.

Решение состоит в том, чтобы изменить

protected abstract Editor<? extends T> getEditorFor(T obj);

на

protected abstract Editor<? super T> getEditorFor(T obj);

, который говорит, что getEditorFor возвращает редактор, который редактирует неизвестный тип, включающий obj.

...