2017-03-28 5 views
0

私が知る限り、 .addメソッドは、ArrayListの整数要素にString要素を追加することはできません。 たとえば、なぜ、整数配列ArrayListに文字列要素を追加できますか?

import java.util.ArrayList; 


public static void main (String...args){ 
    ArrayList<Integer>lst = new ArrayList<Integer>(); 
    lst.add("ab"); 
    System.out.println(lst.get(0)); 
    } 
} 

はコンパイルに失敗します。

ができますあなたの場合、別の方法、

import java.util.ArrayList; 


public class Test { 
    public static void addToList(ArrayList a){ 
    a.add("abcd"); 
    } 

public static void main (String...args){ 

    ArrayList<Integer>lst = new ArrayList<Integer>(); 

    addToList(lst); 
    System.out.println(lst.get(0)); 
    } 
} 

これは問題なく "ABCD" を印刷します。

実際に、整数のArrayListにメソッドを使用してStringを追加できるのはなぜですか?

+0

をチェックする必要はありません。配列リスト – Beginner

+1

'addToList(ArrayList a)'は[**未加工タイプ**]です(https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html)。 ***生の種類***を使用しないでください。 –

+1

私が理解していることは、Javaジェネリックがこれを行えるように設計された理由は、すべてがキャストされなければならないときに、ジェネリックのJavaで既存のプログラムを壊さなかったからです。レッスン - ***生のタイプ***を使用しないでください(すでに誰かがそれを言っていましたか?) –

答えて

0

実際に、整数のArrayListにメソッドを使用してStringを追加できるのはなぜですか?

実行時にはタイプがないためです。タイプの消去が行われ、配列リストが一般的になります。あなたの最初のケースで

、コンパイラがでチェックを入れます。

コンパイラは、後者の場合には失敗したなぜあなたはタイプ

public static void addToList(**ArrayList** a){ 
    a.add("abcd"); 
    } 

外でのArrayListを持っていたので、そのは、したがって、あなたはには何も追加することができますそれ。

2

2番目の例では、ArrayListをメソッドに渡すときにジェネリック型を削除しました。

Javaは実行時にジェネリックを強制しないので、あなたが欲しいものを渡すことができるのはObjectだからです。

0

Javaジェネリックの歓迎へようこそ。これに対する答えは、メソッドを分離するだけでなく、ArrayListではなくraw型でもメソッドを宣言したためです。コンパイラが不一致の型を検出できるように、関数名にコンパイラを組み込んだ場合、コンパイルされませんでした。

この理由は型消去と呼ばれ、Javaバイトコードは実際にコンパイラに提供するすべての情報を実際には含んでいません。バイトコードには生の型ArrayListだけが含まれています。コンパイラエラーを引き起こすパラメータ化は、型キャスト関連のバグを防ぐのに役立つ開発者の便宜です。したがって、生の型リファレンスを使用する場合は、Collection内に任意のタイプのオブジェクトを自由に配置できます。しかし、これをやってはいけません。問題を尋ねるだけで、コンパイラのアシストを守るのは、明らかな理由からベストプラクティスです。あなたに

0

サブクラスがメソッドを呼び出すことができるスーパークラスを拡張するだけのように、第2のサンプル、a = new ArrayList<Integet>変数の生タイプ、スーパークラスに属し、あなたがそのタイプを指定していないので、タイプ多分

関連する問題