0

インターフェイスの実装をインターフェイスにキャストしようとすると、予期しないエラー(「変換不可能なタイプ」)が発生します。

私は次のインターフェースを与えられています

public interface IAbc {...}

および別のクラスの次のメソッド

public class SomeClass {
    public doSomething(Iterable<IAbc> abcs) {...}
}

私は次のクラスを書きました

public class MyAbc implements IAbc {...}

私はこのような他の場所に方法を持っています

public class MyClass {
    public Iterable<MyAbc> getMyAbcs() {...}
}

私はこれらを次のようにうまくリンクできると思っていました:

public void doSomethingWithThings(SomeClass sc, MyClass mc) {
    sc.doSomething(mc.getMyAbcs());
}

しかし、NetBeansは私に次のエラーを出します:

エラー:変換不可能なタイプ
sc.doSomething(mc.getMyAbcs());
が必要です:反復可能
が見つかりました:反復可能

キャストしようとしましたIterable<IAbc> abc = (Iterable<IAbc>)mc.getMyAbcs();が、同じエラーが発生します。

インターフェイスのIterableを期待するメソッドにインターフェイスのIterableの実装を渡すにはどうすればよいですか?

4

1 に答える 1

7

Iterable<MyAbc>ですが、ではありませんIterable<IAbc>MyAbcIAbc

次のようなワイルドカードを試してください。

public doSomething(Iterable<? extends IAbc> abcs) {...}

これは配列の反対であり、配列は次MyAbc[]のとおりです。Iabc[]

詳細については、こちらのチュートリアルをご覧くださいhttp://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

于 2013-03-05T15:52:40.773 に答える