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

如下:importjava.util.*;classSnow{}classPowderextendsSnow{}classCrustyextendsSnow{}class... 如下:
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()方法是用的规则?
展开
 我来答
百度网友a071464
2009-01-24 · TA获得超过223个赞
知道答主
回答量:209
采纳率:0%
帮助的人:115万
展开全部
无语,LS的居然复制我的回答。

我刚才试了1下, 这样是可以的。
List<Powder> snow2=Arrays.asList(new Light(),new Heavy() );

我发现当有两个条件的时候,可以实现List<x1> x=Arrays.asList(new x2(),new x3());

首先,x1必须是x2,x3的直属父类(也就是说x2,x3都是继承自x1),第2,必须至少有2个继承类的申明才能通过编译。

也就是说
class Light extends Powder{}//必须得至少有2个类继承。
class Heavy extends Powder{}

List<Powder> snow2=Arrays.asList(new Light(),new Heavy() );
经过尝试,这一句,如果变成
List<Powder> snow2=Arrays.asList(new Light());就无法通过编译。
就算Powder这个类只有1个继承类Light,也是一样无法通过编译。
也就是说这种情况无法通过编译:

class Light extends Powder{}
//class Heavy extends Powder{} 将这一个类注释掉,也就是说现在Powder只有1个继承类Light了。那么:
List<Powder> snow2=Arrays.asList(new Light());这1句无法通过编译。

也就是说:要满足2个条件才能让
List<x1> x=Arrays.asList(new x2(),new x3());通过编译。
第1个已经说了。 第2个就是x1至少有2个继承类,比如x2,x3并且在使用asList的时候,都要将x2,x3丢到asList()里面:
Arrays.asList(new x2(),new x3()),

才能通过声明。

但是有1个问题,如果有100个类继承名为X1的基类,那是不是要把100个子类的都丢到asList里呢,比如这样:Arrays.asList(new x1(),new x2()……new x100()) 呢?

我的试验结果是:不需要。 List<x1> x =Array.asList(),这1句的asList里面,最少只用丢2个x1的继承类的对象就可以通过编译了。
List<x1> x=Arrays.asList(new x2(),new x3())

但是具体为什么会这样,我也没想明白哈
zfhdd
2009-01-24 · TA获得超过313个赞
知道小有建树答主
回答量:258
采纳率:0%
帮助的人:0
展开全部
可以这样:
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()); 似乎就是顺理成章的事情了。

事实上,我后来试验,List<Snow> sonw1=new ArrayList<Power>(); 这样根本就无法通过编译。 你刚才的 List<Snow> snow1=Arrays.asList(new Power),基本上应该等于这句了List<Snow> sonw1=new ArrayList<Power>();
当创建1对对象的容器时:List<xxx> snow1=new ArrayList<xxx>,两边的中括号里面的XXX应该是同一个类。 要不然,类型就不匹配。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tangke1012
2012-10-09 · TA获得超过657个赞
知道答主
回答量:235
采纳率:0%
帮助的人:59.4万
展开全部
Arrays.asList() = new ArrayList()
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式