0

私が機能を持っているとしましょう:

public Set<String> giveUp()
{
    Set<String> alreadyGuessed = guessed;
    guessed = new LinkedSet<String>();

    //fill Guessed with possible words
    anag(currentWord, "");

    //Remove ones already guessed
    Iterator<String> alGuessIterator = alreadyGuessed.iterator();
    while (!alGuessIterator.done())
    {
        guessed.remove(alGuessIterator.get());
        alGuessIterator.advance();
    }

    return guessed;
}

この関数を呼び出して、次のような行を使用して保存しようとすると:

LinkedSet<String> notGuessed = (LinkedSet<String>)wordGame.giveUp();

上記の関数の内部実装に関係なく、これは常に安全ですか? つまり、Guessed が ArraySet でなくても、完全に安全なキャストを維持できるのでしょうか? それとも、返されるインターフェイスのポイントを誤解していて、キャストの必要性を防ぐために「Set notGuessed」を持っているはずですか?

私の先生は授業に関する質問には役に立たず、危険なキャストを行うとすぐに 0 を返してくれます。

4

5 に答える 5

2

基になる Type を確認できないため、これは安全ではありません。Setインターフェイスによって定義されたメソッドにアクセスする必要があるだけの場合は、次を使用する必要があります。

Set<String> set = wordGame.giveUp();

これが である場合LinkedSet、コードは「動作」しますが、そうでない場合はClassCastException. LinkedSet何らかの理由で特にが必要な場合、メソッドは明示的にgiveUp()を返す必要があります。LinkedSet

于 2012-11-06T00:34:45.487 に答える
0

いいえ、Set を返し、LinkedSet にキャストしています。

変えたら

Set<String> alreadyGuessed = guessed;
guessed = new LinkedSet<String>();

Set<String> alreadyGuessed = guessed;
guessed = new HashSet<String>();

クラスキャスト例外が発生します。

リンクされたセットはセットですが、セットは必ずしもリンクされたセットではありません。コードで Linkedset 固有のメソッドを使用していない限り、キャストを削除してください。

于 2012-11-06T00:35:16.493 に答える
0

ローカルでのみ使用されるものには、グローバル フィールドを使用しない方がはるかに優れています。この場合、guessedローカルで宣言してから、anag何かを返す必要があります。

物事を正しいスコープに保つことは時々面倒ですが、ここで扱っている正確な種類の混乱を防ぎます.

あなたが尋ねた実際の問題に関しては、メソッドが a を返すようLinkedSetにすれば、キャストについて心配する必要はありません。

于 2012-11-06T00:35:50.273 に答える
0

インターフェイス参照型を返すという全体的な考え方は、すべてのユーザーがそれが提供するメソッドに満足し、基になる実装について心配する必要がないということです。キャストする必要がある場合は、間違っています。

于 2012-11-06T00:36:30.757 に答える
0

いいえ、ClasscastException戻り値の型がキャストしている型とまったく同じでない限り、キャストは失敗します。

この投稿を読んで、インターフェイスにプログラムする理由を理解してください

于 2012-11-06T00:34:34.887 に答える