7

私の質問は非常に単純かもしれませんが、

Result私はいくつかの内部フィールド、セッター、ゲッターを持つクラスを持っています。

さらに、いくつかのフィールドといくつかのデータSpecial1Resultを拡張して含むクラスがあります。ResultSpecial2Result

別のクラスDispatcherで、次のメソッドを作成しました。

processResults(List<? extends Result> results)、これはよく知られていResultます(拡張された結果オブジェクトに特定のフィールドがあるかどうかを照会するには、このメソッドが必要です-私は注釈を使用しています)。

そこで、拡張 for-each ループを使用することにしました。for (Result res : results) {}

それで私の質問は何ですか?拡張オブジェクト用にこれを for ループで記述する方法を Web で見つけようとしています。たとえば、このようなものです。for (? extends Results res: results){}

出来ますか?正しい書き方は?

4

4 に答える 4

5

aについて知っているのList<? extends Result>は、各要素がResult-になるということだけです。これで、拡張forループ構文に入れることができるのはそれだけです。

で宣言されていないメンバーが必要な場合はResult、ループ内にキャストする必要があります。

for (Result result : results) {
    if (result instanceof CleverResult) {
        CleverResult clever = (CleverResult) result;
        // Use clever here
    }
}

拡張されたforループを使用していなかった場合に何を書くかを考えてください。それでも、キャストを書く必要がありますね。

もちろん、リストに特定のタイプが1つだけ含まれている必要があることがわかっている場合、ループ内でいつでも無条件にキャストできます。

于 2012-09-27T14:06:42.973 に答える
3

拡張オブジェクト用にこれを for ループに記述する方法を Web で見つけようとしています。たとえば、このようなものです。

for (? extends Results res: results){}

いいえ、これは不可能です。実行時に動的に提供されるアイテムを静的に型付けすることはできません。

正しい書き方は?

あなたはすでにそれをやっています:

for (Results res: results) {
}

Special2Resultそのループ内でテストしたい場合は実行できますが、通常は設計を改善できることを示しています。より良い代替手段は、 Visitor パターンなどの二重ディスパッチのメカニズムを使用して、サブクラスの特別な処理の詳細を隠すことです。

于 2012-09-27T14:09:11.567 に答える
1

具体的なサブクラスはフィールドの性質によってのみ異なるため、単純なポリモーフィズムの恩恵を受けることをお勧めします。

必要な数のクラスまたはサブクラスによって実装されるメソッド クラスをResult定義するインターフェイス/抽象クラスになってしまいます。execute()

したがって、クライアント コードは以下を使用するだけです。

for (Result res : results){    //results being as a List<Result> type
  res.execute(); 
}
于 2012-09-27T14:10:44.233 に答える
1

Java には型消去があります。コレクションの具体的な型パラメーターは実行時に存在しません。

したがって、List がある場合、Java コンパイラは、コードが Result のサブクラスではないものをリストに入れないようにします。

したがって、実行時にループが知ることができるのは、コンテンツがすべて Result のサブクラスであることだけです。したがって、それらをループする唯一の方法は、サブクラスの結果として存在するポリモーフィックな動作を伴う Result への参照のセットとして使用することです。リストにあるもの。

于 2012-09-27T14:07:41.083 に答える