web-dev-qa-db-ja.com

Java=配列は同種ですが、ArrayListは同種ではないということはどういう意味ですか?

Type []がある場合は、Typeまたはそのサブタイプのみを格納できます。同じことがArrayListにも言えます。では、なぜ一方は均質であるのに他方は均質でないと言われているのですか?

13
lfk

配列には、追加された要素のタイプに関するランタイムチェックがあります。つまり、同じタイプではない新しい要素が追加されると、実行時に ArrayStoreException がスローされます。それが、「同種」と見なされる理由です。

これはArrayLists(Lists全般)には当てはまりません。実行時の型消去により、実質的にあらゆるオブジェクトを保持できます。

以下は実行時に例外をスローします:

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

ジェネリックスを正しく使用することで、つまり、変数listArrayListではなく、タイプ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

18
manouti

はい。JavaArraysは同種です。これは、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

しかし、ArrayListCollectionの部分であり、特定のdata-type [Objects]について話していない場合は、代わりにgenericsを保持します。 Java=内のすべてのものはObjectclassから直接または間接的に継承されるため、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を格納する理由を知っています-タイプ、したがって、それらは不均一で均一ではありません。

2
Mehraj Malik