非常简单的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 }}
答案 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
的未知类型的编辑器。