Type []がある場合は、Typeまたはそのサブタイプのみを格納できます。同じことがArrayListにも言えます。では、なぜ一方は均質であるのに他方は均質でないと言われているのですか?
配列には、追加された要素のタイプに関するランタイムチェックがあります。つまり、同じタイプではない新しい要素が追加されると、実行時に ArrayStoreException
がスローされます。それが、「同種」と見なされる理由です。
これはArrayList
s(List
s全般)には当てはまりません。実行時の型消去により、実質的にあらゆるオブジェクトを保持できます。
以下は実行時に例外をスローします:
Object[] array = new String[3];
array[0] = "a";
array[1] = 1; // throws Java.lang.ArrayStoreException
問題なくコンパイルして実行する次のコードとは異なります(ただし、ジェネリックを適切に使用しないためコンパイラの警告が表示されます)。
ArrayList list = new ArrayList<String>();
list.add("a");
list.add(1); // OK
list.add(new Object()); // OK
ジェネリックスを正しく使用することで、つまり、変数list
をArrayList
ではなく、タイプArrayList<String>
で上記のように宣言すると、コンパイル時に問題が回避されます。
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add(1); // compilation error
list.add(new Object()); // compilation error
しかし、一般的に宣言されたリストを使用しても、実行時に例外なしに次のようなことができます。
ArrayList<String> list = new ArrayList<String>();
list.add("a");
Method[] methods = List.class.getMethods();
for(Method m : methods) {
if(m.getName().equals("add")) {
m.invoke(list, 1);
break;
}
}
System.out.println(list.get(0));
System.out.println((Object) list.get(1));
出力:
a
1
はい。Java
Arrays
は同種です。これは、Javaで配列を宣言する場合、そのtype
を宣言する必要があるためです。例:
int arr[]; //type is int
String arr[]; //type is String
float arr[]; //type is float
宣言した配列に他のデータ型を格納しようとすると、コンパイル時エラーになります。例えば:
int arr=new int[5];
arr[0]="I am a String not int"; //compile time error
しかし、ArrayList
はCollection
の部分であり、特定のdata-type
[Objects
]について話していない場合は、代わりにgenerics
を保持します。 Java=内のすべてのものはObject
class
から直接または間接的に継承されるため、compile-time error,
typeのチェックはオンになりますrun-time
。
例えば:
ArrayList al=new ArrayList();//type is Object
al.add("I am a String"); //Bacause String class in inherited from Object Class
al.add(1);//the int 1 will first autobox into Integer class then stored in al ArrayList.Now bacause Integer class is also inherited from Object class,it will*/ allow you to store
al.add(UserDefinedClass); //because every User defined class is also inherited from Object class,so it will also allow you.
ArrayList al
のデータ型を定義していないので気づきましたか?それでも、異なる型の値を格納しています。これは、ArrayList
が特定のデータではなくObject
を格納する理由を知っています-タイプ、したがって、それらは不均一で均一ではありません。