2011-12-27 9 views
1

かなり簡単な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はEntitygetEditorFor(T obj)Tセットを持っていますXが依存Editor<X>を返すために責任がありますobjのコンクリートタイプであり、常にIs-A Tです。したがって、SubTypeDependentEditor<Entity>をお持ちの場合、objEntityAEditor<EntityB>の場合にはEditor<EntityA>が返されます。objEntityBの場合、getEditorFor(T obj)が返されます。

これは警告なしでも実装できますか?

更新:

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

は基本的に他の署名を持っていますが、この方法は私がgetEditorFor(T obj)を実装するかどうかはわかりませんEditor<T>を返した場合のように、コードが唯一、Editor<X>あるオブジェクトを持っていることを実装するコードができます。

+1

コードにはどのようなエラーがありますか? – chrisbunney

+2

ワイルドカード( '?extends T')をどこでも' T'の代わりに使う場所はありますか? –

+0

コンパイラは実際にどのようなエラーを出していますか? 'edit'メソッドは' Editor'インターフェースで定義されていますか? – Natix

答えて

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

getEditorFor()あなたはコンパイラが持つことobj作品を証明することはできないので、その結果をタイプTの任意の値を使用渡すことはできませんT.

の未知のサブタイプのエディタを返すことを意味し同じ具体的なサブタイプTobjのタイプです。

ソリューションはgetEditorForobjを含み、未知のタイプを編集エディタを返すと言ってい

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

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

を変更することです。

関連する問題