【JAVA】求教!Arrays.asList()方法在这个程序中是怎么运行的?

来源:百度知道 编辑:UC知道 时间:2024/07/05 02:41:43
如下:
import java.util.*;

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 {
public static void main(String[] args){
List<Snow> snow1=Arrays.asList(new Crusty(),new Slush(),new Powder());

//List<Snow> snow2=Arrays.asList(new Light(),new Heavy());
//这句编译错误,提示不能从List<Powder>转换为List<Snow>

List<Snow> snow3=new ArrayList<Snow>();
Collections.addAll(snow3, new Light(),new Heavy());

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

snow1和snow2里的对象不都是从snow中继承过来的吗?应该能够向上转型才对啊,但是为什么snow1能创建而snow2不能创建呢?

谁能准确的解释一下Arrays.asList()方法是用的规则?

可以这样:
List sonw1=Arrays.asList(new Power());
sonw1.add(Arrays.asList(new light()));
也就是说,1开始声明1个list的时候,压根就不声明类型。```直接 List xxx=xxx;

而这样做是可以的,但是却会产生 一个异常···UnsupportedOperationException。
无语。

根据刚才的经验,本人再次试验,原因肯定就处在Arrays.asList上。
我刚才试了一下,可以这样: List<Snow> sonw1=new ArrayList<Snow>();
sonw1.add(new Power());
sonw1.add(new light());
也就是说,本身容器类是支持向上转型的。
而List<snow> snow1=Arrays.asList();问题应该就出在这1句上面。
API上面这样写asList的:返回一个受指定数组支持的固定大小的列表。
将一个指定数组的固定大小的list列表,也就是先前编译时候下面给的提示:
找到: java.util.List<Power>
需要: java.util.List<Snow>
也就是说,先前可能是:将一个List<Power>类的容器对象,赋给了一个List<Sonw>的引用(也就是大概相当于这样):List<Snow> xx=new ArrayList<Power>();因为这中间无法发生向上转型。所以匹配错误。
而当首先创建一个List<Snow> sonw1=new ArrayList<Snow>(); 这样,就创建了一个List<Snow>类的容器对象,并且赋给了一个List<Snow>类的引用。
那么,再添加Snow类的子类。sonw1.add(new light()); 似乎就是顺理成章的事情了。