了解类层次结构& OOP与Arrays.asList类型转换问题有关

时间:2013-09-15 02:53:55

标签: java oop inheritance hierarchy class-hierarchy

我正在学习Thinking in Java这本书。 我的问题是为什么这行中没有类型转换异常:

List<Snow> snow4 = Arrays.<Snow>asList(new Light(), new Heavy());

即使新的Light()new Heavy()Powder类型,也可以在本书的以下代码示例中找到:

package com.yanbit.collection.basic;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

class Snow {
}

class Powder extends Snow {
}

class Crusty extends Snow {

}

class Stush extends Snow {
}

class Light extends Powder{}

class Heavy extends Powder {
}

public class AsListInference {
    public static void main(String[] args) {
    // swith list<Snow>
    List<Snow> snow1 = Arrays.asList(new Powder(), new Crusty(),
        new Stush());
    // List<Snow> snow2 = Arrays.asList(new Light(), new Heavy());
    // type list<power>
    List<Snow> snow3=new ArrayList<Snow>();
    Collections.addAll(snow3, new Light(), new Heavy());// implict type
    List<Snow> snow4 = Arrays.<Snow> asList(new Light(), new Heavy());

    }
}

2 个答案:

答案 0 :(得分:1)

继承是分层的。 LightHeavyPowder的子类,但PowderSnow的子类,因此可以从LightHeavy对象Snow对象。

您可以执行从子类到其任何父类(或实现的接口)的强制转换,因此为什么每个引用类型都可以强制转换为Object

答案 1 :(得分:0)

这超越了Java编程。类层次结构是一个基本概念,您需要了解它才能在任何面向对象的编程中取得成功。

基本上,您需要了解Light类是否继承了所有属性&amp;粉末类的方法。 Powder类继承了所有属性&amp; Snow类的方法。因此,Light类通过继承,也将继承所有的属性和属性。 Snow类的方法。

当您声明List对象能够容纳任何类型的Snow对象时,您允许它保存Snow的任何实例以及Snow的子类的任何实例。无论你将Snow分类多少次都是如此。

我会在OOP上阅读更多内容。在你用“Java思考”之前,你需要能够像面向对象的程序员一样思考。

一个简单的谷歌搜索提出了这些链接:

http://staff.science.uva.nl/~heck/JAVAcourse/ch3/s1.html

http://www.ics.uci.edu/~pattis/ICS-21/lectures/inheritancei/lecture.html

希望这有帮助。祝你好运!