-1

このコードがコンパイルされない理由を理解しようとしています。
インターフェイスを実装するクラスがあります。最後のメソッドは、何らかの理由でコンパイルされません。

セットをセットとしてキャストするだけでなく、単一のオブジェクトを正常に返すことができます。

誰かが私にこれがなぜであるか説明してもらえますか?ありがとう。

public class Testing2 {

    public SortedSet<ITesting> iTests = new TreeSet<ITesting>();
    public SortedSet<Testing> tests = new TreeSet<Testing>();

    public ITesting iTest = null;
    public ITesting test = new Testing();

    // Returns the implementing class as expected
    public ITesting getITesting(){
        return this.test;
    }

    // This method will not compile
    // Type mismatch: cannot convert from SortedSet<Testing> to SortedSet<ITesting>
    public SortedSet<ITesting> getITests(){
        return this.tests;
    }

}
4

4 に答える 4

6

単純に、aはSortedSet<Testing> ではありませんSortedSet<ITesting>。例えば:

SortedSet<Testing> testing = new TreeMap<Testing>();
// Imagine if this compiled...
SortedSet<ITesting> broken = testing;
broken.add(new SomeOtherImplementationOfITesting());

これで、ではないSortedSet<Testing>要素が含まれるようになります。それは悪いことです。Testing

あなたができることはこれです:

SortedSet<? extends ITesting> working = testing;

...その場合、セットから値を取得することしかできないためです。

したがって、これは機能するはずです。

public SortedSet<? extends ITesting> getITests(){
    return this.tests;
}
于 2013-02-28T21:43:11.120 に答える
1

と仮定するITestingと、のスーパータイプですTestingジェネリック型はポリモーフィックSortedSet<ITesting>ではないため、のスーパー型ではありませんSortedSet<Testing>ポリモーフィズムは、ジェネリック型には適用されません。? extends ITestingおそらく、リターンタイプとして下限のあるワイルドカードを使用する必要があります。

public SortedSet<? extends ITesting> getITests(){
    return this.tests;
} 
于 2013-02-28T21:43:27.153 に答える
0

宣言にタイプミスがあります。

public SortedSet<Testing> tests = new TreeSet<Testing>();

メソッドがITestingを返すようにする場合、またはメソッドが返す必要がある場合は、そこでITestingを実行する必要があります。

SortedSet<Testing>
于 2013-02-28T21:43:17.643 に答える
0

代わりにこれが必要だと思います:

public SortedSet<Testing> getTests(){
    return this.tests;
}

現在、を返そうとしています。これは、ではなくtests、として宣言されています。SortedSet<Testing>SortedSet<ITesting>

于 2013-02-28T21:43:19.767 に答える