JavaのArrays.asList

4453 ワード

参考資料:Javaプログラミング思想
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クラスを継承するため、LightPowderクラスの両方の最低階層の共通親クラスは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.asListList<Snow>クラスとなっているので、エラーは報告されません.