JavaのArrays.asList
参考資料:Javaプログラミング思想
Arraysはツールクラスであり、他のインタフェースは実装されず、
結論:Arrays.asListは可変パラメータ中の全てのオブジェクトの最低階層の共通親のオブジェクトを返す.
まず、1.
2.
しかし、ここで疑問があります.
2.のコードを(ワイルドカードを使用する):
あるいは、
これでいい
さらに5.
Arraysはツールクラスであり、他のインタフェースは実装されず、
Object
を除くクラスも継承されていない.その役割は、汎用可変パラメータを固定長List
オブジェクトに変換することであり、Javaプログラミングの考え方では、「Arrays.asList()メソッドの制限は、生成されたListのタイプに対して最も理想的な仮定を行い、どのようなタイプを与えるかに気づかなかった」と述べている.class Snow{}
class Powder extends Snow{}
class Crusty extends Snow{}
class Slush extends Snow{}
class Light extends Powder{}
class Heavy extends Powder{}
public class AsListInference {
/** * @param args */
public static void main(String[] args) {
//1.
List<Snow> list1=Arrays.asList(new Powder(),new Crusty());
//2. : Type mismatch: cannot convert from List<Powder> to List<Snow>
List<Snow> list2=Arrays.asList(new Powder(),new Light());
//3. : Type mismatch: cannot convert from List<Powder> to List<Snow>
List<Snow> list3=Arrays.asList(new Light(),new Heavy());
//4.
List<Snow> list4=Arrays.asList(new Crusty(),new Slush(),new Powder(),new Light(),new Heavy());
//5.
List<Snow> list5=Arrays.asList(new Crusty(),new Light());
}
}
結論:Arrays.asListは可変パラメータ中の全てのオブジェクトの最低階層の共通親のオブジェクトを返す.
まず、1.
Powder
クラスとCrusty
クラスはいずれもSnow
クラスを継承している.すなわち、それらの2つの最低レベルの共通親クラスはSnow
クラスであり、もちろん最高レベルの共通親クラスはObject
クラスであるため、1のArrays.asList
で得られたものはList<Snow>
であるため、エラーは報告されない.2.
Light
クラスはPowder
クラスを継承するため、Light
とPowder
クラスの両方の最低階層の共通親クラスはPowder
クラスであり、このときArrays.asList
が得たのはList<Powder>
であり、それをList<Snow>
に付与するとエラーが報告される.しかし、ここで疑問があります.
Powder
類はSnow
類を継承しているのではないでしょうか.2.のコードを(ワイルドカードを使用する):
List<? extends Snow> list2=Arrays.asList(new Powder(),new Light());
あるいは、
Arrays.asList
によって生成されたList
タイプについて、コンパイラが実際のターゲットタイプが何であるべきかを示すために、タイプパラメータの説明を表示する.List<Snow> list2=Arrays.<Snow>asList(new Powder(),new Light());
これでいい
さらに5.
Crusty
クラスはSnow
クラス、Light
クラスはPowder
クラス、Powder
クラスはSnow
クラスを継承し、Crusty
クラスとLight
クラスの最低階層の公共親クラスはSnow
クラスであるため、Arrays.asList
はList<Snow>
クラスとなっているので、エラーは報告されません.