-5

我正在研究《用Java思考》这本书。我的问题是为什么这一行没有类型转换异常:

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

即使 newLight()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());

    }
}
4

2 回答 2

1

继承是分层的。LightHeavy是 的子类Powder,但是Powder是 的子类Snow,因此存在从 a LightorHeavy对象到Snow对象的直接强制转换。

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

于 2013-09-15T02:56:15.790 回答
0

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

本质上,您需要了解 Light 类继承了 Powder 类的所有属性和方法。Powder 类继承了 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

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

于 2013-09-19T13:46:30.953 回答