かなり簡単な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 {}
1はEntity
とgetEditorFor(T obj)
にT
セットを持っていますX
が依存Editor<X>
を返すために責任がありますobj
のコンクリートタイプであり、常にIs-A T
です。したがって、SubTypeDependentEditor<Entity>
をお持ちの場合、obj
がEntityA
、Editor<EntityB>
の場合にはEditor<EntityA>
が返されます。obj
がEntityB
の場合、getEditorFor(T obj)
が返されます。
これは警告なしでも実装できますか?
更新:
protected abstract Editor<? extends T> getEditorFor(T obj);
は基本的に他の署名を持っていますが、この方法は私がgetEditorFor(T obj)
を実装するかどうかはわかりませんEditor<T>
を返した場合のように、コードが唯一、Editor<X>
あるオブジェクトを持っていることを実装するコードができます。
コードにはどのようなエラーがありますか? – chrisbunney
ワイルドカード( '?extends T')をどこでも' T'の代わりに使う場所はありますか? –
コンパイラは実際にどのようなエラーを出していますか? 'edit'メソッドは' Editor'インターフェースで定義されていますか? – Natix