1

以下はサンプルコードです:

for(int i = 0; i < clientListFromFile.size(); i++)
    {
        DisplayClient dc = null; // DisplayClient is another class
        dc = (DisplayClient)clientListFromFile.get(i); // clientListFromFile is the a list.
    }

Displayclientを前に置く手段は何 clientListFromFileですか?

int prevID = (int)clientList.get(clientListCount-1);

これは別の例です。なぜ置くの(int) infront clientList.get(clientListCount-1)ですか?

4

5 に答える 5

3

これはキャストです。変数が、コンパイル時に認識しているよりも具体的な型である可能性があることをJavaに伝えています。これには、実行時に確実にそのタイプであることを確認する必要があるという点で、ある程度の危険が伴います。そうしないと、例外がスローされます。

これは、ジェネリックが導入される前に、特にコレクションで広く使用されていました。ただし、ジェネリックはコンパイル時により高度な型定義を提供するため、多くのキャストは不要になります。リストからアイテムを取得するときにキャストが必要であることがわかった場合は、おそらくジェネリック型を適切に宣言していない (またはまったく宣言していない) ため、これを修正することを検討する必要があります。

次のコードでは、ジェネリックを使用せずに古い構文を使用しています。コンパイラはリストの型について何も知らないため、最後の行がコンパイルされないことに注意してください。そのため、型は常にオブジェクトです。したがって、それを機能させるにはキャストが必要です。

List list = new ArrayList();
list.add("hello");
String s = list.get(0); //Doesn't compile
String s = (String)list.get(0); //Does compile

このアプローチは現在推奨されておらず、実際には下位互換性の理由からのみ許可されています (ジェネリックが導入される前は、これが唯一の方法でした)。文字列ではないものがリストに入った場合、それを止めるものは何もありません。次の例では、ジェネリックを使用しているため、キャストを廃止しています。

List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);

このアプローチでは、リストに入れたりリストから取り出したりするものはすべて文字列であることが保証されます。それ以外の場合、コードはコンパイルされません。

于 2012-12-11T13:37:47.560 に答える
2

これはキャストであり、宣言でジェネリックを使用する場合などは必要ありません。List

List<? extends Client>

これで、ループは次のようになります。

for (int i = 0; i < clientListFromFile.size(); i++) {
   Client dc = = clientListFromFile.get(i); 
}
于 2012-12-11T13:39:12.343 に答える
1

おそらく、両方のリストが特定のタイプを使用しておらず、rawtypeであるかList clientListFromFile = new ArrayList();、を使用していList<Object>ます。

その場合、リストからオブジェクトを取得するときに、リストlist.get(...)にあるオブジェクトにキャストする必要があります。

だから基本的にそこに記述されているその鋳造

于 2012-12-11T13:39:26.863 に答える
1

これはキャストと呼ばれます。詳細については、こちらを参照してください

于 2012-12-11T13:38:24.450 に答える
1

明示的なキャストです。リストはより一般的であるため、コードはその特定の型に明示的にキャストしていると思います。

場合によっては暗黙的なキャストを行うこともできますが (アップキャストなど)、通常、ダウンキャストには明示的なキャストが必要です。

于 2012-12-11T13:38:39.627 に答える