我正在学习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());
}
}
答案 0 :(得分:1)
继承是分层的。 Light
和Heavy
是Powder
的子类,但Powder
是Snow
的子类,因此可以从Light
或Heavy
对象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
希望这有帮助。祝你好运!