List list = new ArrayList<String>() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);
上記のコードには型の参照があります リスト のインスタンスを参照 配列リスト タイプの 文字列。ラインが list.add(1)
が実行され、ArrayListに追加された1(String型の)ではないか?はいの場合、なぜこれが許可されるのか?
回答:
回答№1の15型の消去を使用しました。つまり、以前に設定した汎用チェックを無視しました。ジェネリックは実行時にチェックされないコンパイル時の機能であるため、これを回避できます。
あなたが同じものを持っているもの
List list = new ArrayList() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);
または
List<Integer> list = new ArrayList<Integer>() ;
list.add(1) ;
Integer hello = list.get(0); // generics add an implicit cast here
System.out.println(hello);
コンパイラーによって生成されたバイトコードを見ると、違いを見分ける方法はありません。
興味深いことに、あなたはこれを行うことができます
List<String> strings = new ArrayList<String>();
@SuppressWarnings("unchecked");
List<Integer> ints = (List) strings;
ints.add(1);
System.out.println(strings); // ok
String s= strings.get(0); // throws a ClassCastException
回答№2の12
問題はあなたの list
変数には生のタイプがあり、任意のタイプのオブジェクトをこのリストに追加できます。問題を解決するには、それを List
の String
"s:
List<String> list = new ArrayList<String>() ;
回答№3の場合は3
宣言するのでコンパイルします List list
生のタイプを使用します List
、バインドされた型ではありません List<String>
。 2行目がコンパイルされるのは、 list
変数は何でも受け入れます。 3行目がコンパイルされるのは list.get(0)
返品 Object
。 4行目に失敗する理由はありません。
偶然に、コンパイルされたコードで整数1が String
。しかし、それに依存してはいけません。最初の行が適切だった場合
List<String> list = new ArrayList<>();
あなたの間違いはコンパイル時に発見されたでしょう。
答え№4の3
次のようなリストを宣言すると:
List list = new ArrayList<String>() ;
Rawタイプと呼ばれるものを使用しています。 これは、Listのようなジェネリック型パラメーターを持つ型ですが、指定できませんでした。コンパイラーの警告を確認すると、これが通知されていることがわかります。これはOKです:
List<String> list = new ArrayList<String>() ;
そしてこれは大丈夫です(しかし時代遅れです):
List list = new ArrayList();
しかし、あなたが書いた方法は避けるべきです。
問題は、ジェネリックがコンパイラー時にのみチェックされ、コンパイラーに伝えたことです List
、ない List<String>
、だからあなたはそこにあなたが欲しいものを置くことができます!右側にパラメーターがあるという事実は、「実際には何も意味するものではありません」、コンパイラーにとって重要な実際の参照のタイプです。
回答№5の場合は0
List list = new ArrayList<String>() ; // WARNING!!!
安全でないリストは、安全なArrayListを参照します
list.add(1) ; // WARNING!!!
リストに追加された文字列ではなく、整数(整数に変換された整数1はオートボクシングです)
Integer hello = (Integer) list.get(0) ;
安全でないリストには何でも含めることができるため、キャストが必要です。
System.out.println(hello);
Integer.toString()が呼び出されました
行list.add(1)が実行されると、ArrayList(String型)に1が追加されませんか?
はい。 Stringを含むことになっているArrayListに整数が追加されました。
はいの場合、なぜこれが許可されますか?
下位互換性。 Javaは、汎用コードをサポートする必要があります。
リストリスト;これは安全ではないため、何でもできることを意味し、参照されるArrayList()はそれを許容する必要があります。
道徳の: コンパイラの警告を無視しないでください。無視すると、整数が文字列を含むことになっているArrayListに入る場合があります。
答え№6の場合は-1
はい... Javaは他の言語と同様に、プリミティブデータ型の暗黙的(自動)変換(キャスト)を実装するため、1が配列に追加されます。
詳細はこちら コンバージョンとプロモーション
回答№7の-3
これを試して
List.add(Integer.toString(1));
あなたもこれを試すことができます
List list = new ArrayList<Object>() ;
arraylistがStringのArraylistである必要がない場合
回答8の場合は-4
いいえ、Javaは 1
整数として。まず、文字列として数値を変換する必要があります Integer.toString(n)