2012-01-07 8 views
1

このタイプの変換が正しく機能することに問題があります。私の推測は、包括的なワイルドカード<ですか? super SomeType >は、インターフェイス実装では動作しません。制限付きのワイルドカードで型の不一致がありますか? super Type

// sample class definitions 
public interface IFace<T> { ... } 
public class MyClass<T1, T2> { ... } 
public class UtilityClass<T> { 
    public List<MyClass<T, ? super IFace<T>>> getList() { ... } 
} 
public class Actor extends SomeObj implements IFace<TypeA> { ... } 

// use... 
UtilityClass<TypeA> utility = new UtilityClass<TypeA>(); 
List<MyClass<TypeA, Actor>> list = utility.getList(); 

Type mismatch: cannot convert from List<MyClass<TypeA, ? super IFace<TypeA>> to List<MyClass<TypeA, Actor>> 

答えて

0

直感的インターフェースを使用している事実とは何の関係もありません:

public <X super IFace<T>> List<MyClass<T, X> getList() { ... } 

をしかし、この構文は、一般的にそれとして、許可されていませんsuperを使用して型パラメータの下限を与えるのは意味がありません。 http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ107

編集:なぜの良い説明についてはこちらの記事を参照してください、あなたのコードを見てみると

、私はあなたが型パラメータの境界を指定するにextendssuperを混乱することができると思います。 getList()ではなくList<MyClass<T, ? extends IFace<T>>>を返した場合、これは(タイプは何かIFace<T>を実装しなければなりませんつまり)MyClassの第二種のパラメータにバインド上位を指定しているように、それは、有意義だろう。

natix's answer points outとして、汎用戻り型でワイルドカードを使用することは、返されたオブジェクトの汎用型情報を効果的に隠すので、推奨されません。

public <X extends IFace<T>> List<MyClass<T, X> getList() { ... } 

呼び出し元のコードは、タイプinferrence通じXのタイプを指定することができます:代わりに、汎用的な方法を作ります。

+0

ありがとうございます。数分後に私の答えを取り除きます。 –

4

ジョシュアブロッホの効果的なJavaの第2版を引用:

は、戻り値の型としてワイルドカード型を使用しないでください。 をユーザーに柔軟に提供するのではなく、クライアントコードで ワイルドカードタイプを使用するように強制します。

適切に使用されるワイルドカードタイプは、 クラスのユーザーにはほとんど見えません。彼らはメソッドが受け入れるべきパラメータを受け入れるようにします。 そして拒絶すべきものを拒否します。 クラスのユーザーが にワイルドカードタイプについて考える必要がある場合は、 クラスのAPIに問題がある可能性があります。

1

ジェネリック医薬品の使用を開始するときには、必ず読まなければならないのはthis tutorialです。 4ページの「Generics and Subtyping」のセクションを読むと、そのエラーが発生する理由がわかります。それはあなたが1は、一般的な方法で行うことで問題を解決しようとする可能性があり、

+1

チュートリアルのリンクが壊れているようです。類似の情報へのリンクは次のとおりです。http://docs.oracle.com/javase/tutorial/java/generics/index.html – SteveT

関連する問題