关于泛型有界通配符类型的混淆

时间:2011-12-27 20:05:15

标签: java generics bounded-wildcard

非常简单的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设置为EntitygetEditorFor(T obj)负责返回Editor<X> X取决于obj的具体类型并且总是Is-A T。因此,如果您有SubTypeDependentEditor<Entity>,则getEditorFor(T obj)会在Editor<EntityA> obj时返回EntityAEditor<EntityB>会在obj EntityB时返回protected abstract Editor<? extends T> getEditorFor(T obj); }}

这可以在没有警告的情况下实施吗?

更新

Editor<X>

基本上可以有任何其他签名,但实现该代码的代码只有Editor<T>的对象,所以如果这个方法返回getEditorFor(T obj)我不知道如何实现{{1 }}

1 个答案:

答案 0 :(得分:4)

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

表示getEditorFor()返回T的未知子类型的编辑器。

由于编译器无法证明T使用obj的{​​{1}}的具体子类型T,因此无法使用任何类型obj的值。 1}}的类型。

解决方案是改变

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

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

表示getEditorFor返回编辑包含obj的未知类型的编辑器。