【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()方法是用的规则? 展开
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()方法是用的规则? 展开
展开全部
无语,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())
但是具体为什么会这样,我也没想明白哈
我刚才试了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())
但是具体为什么会这样,我也没想明白哈
展开全部
可以这样:
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应该是同一个类。 要不然,类型就不匹配。
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应该是同一个类。 要不然,类型就不匹配。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Arrays.asList() = new ArrayList()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询