关于JAVA泛型问题,自动转换与手动转换。
首先,List<String>list1=newArrayList();list1.add(123);list1.add("cccc");list1.add("cc11"...
首先,List<String> list1=new ArrayList();
list1.add(123);
list1.add("cccc");
list1.add("cc11");
会出现错误。可以很明显的看到。比如说:list.add(123);就不符合。
List list1=new ArrayList<String>();
list1.add("cccc");
list1.add("cc11");
list1.add(123);
可是这个,如果输出的话, list.add(123);是会打印出来的。
有人说这个会自动转换的,那么是不是意味着ArrayList<String>();会转换为其他的?
因为123是数字型,可是它会输出,也就是说<String>这个就不管用了。
我知道 List list=new ArrayList();两边都加泛型比较好。
可是,我就是对 只单独加一边存在疑问。
为什么加在左边与右边不同。
而且是不是真的存在手动转换与自动转换的原因? 展开
list1.add(123);
list1.add("cccc");
list1.add("cc11");
会出现错误。可以很明显的看到。比如说:list.add(123);就不符合。
List list1=new ArrayList<String>();
list1.add("cccc");
list1.add("cc11");
list1.add(123);
可是这个,如果输出的话, list.add(123);是会打印出来的。
有人说这个会自动转换的,那么是不是意味着ArrayList<String>();会转换为其他的?
因为123是数字型,可是它会输出,也就是说<String>这个就不管用了。
我知道 List list=new ArrayList();两边都加泛型比较好。
可是,我就是对 只单独加一边存在疑问。
为什么加在左边与右边不同。
而且是不是真的存在手动转换与自动转换的原因? 展开
4个回答
展开全部
两边都加的话一定不会错!
你就是问
List<String> list1=new ArrayList();
List list1=new ArrayList<String>();
有什么不同吧 。
左边是定义,右边是赋值。List<String> list1 定义了类型是String所以加不上去
而ArrayList是List的子类,我们知道父类可以 new 一个子类实现实例化。
这种父类的实例可以用自己的所有方法,不过父类某个方法被子类重写了的话会覆盖该方法。
你就是问
List<String> list1=new ArrayList();
List list1=new ArrayList<String>();
有什么不同吧 。
左边是定义,右边是赋值。List<String> list1 定义了类型是String所以加不上去
而ArrayList是List的子类,我们知道父类可以 new 一个子类实现实例化。
这种父类的实例可以用自己的所有方法,不过父类某个方法被子类重写了的话会覆盖该方法。
展开全部
因为你list1是左边类型的实例,你开始可以不实例化List list1=null;List list1;
后面你可以根据需要使用不同的实例化方法
后面你可以根据需要使用不同的实例化方法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
加在左右两边两个的意思完全不同:
左边的意思是一个 String 型的LIST 数组 所以添加的时候有限制。
右边的意思是一个LIST数组 这是父类指向子类,判断时是根据父类的变化而变化,父类LIST 可以存放任何类型的数组。
一般泛型都是2边同时限制,这样才有意义。
左边的意思是一个 String 型的LIST 数组 所以添加的时候有限制。
右边的意思是一个LIST数组 这是父类指向子类,判断时是根据父类的变化而变化,父类LIST 可以存放任何类型的数组。
一般泛型都是2边同时限制,这样才有意义。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
从JVM的角度来分析出错原因:
先说List<String> list1=new ArrayList();
大家知道 new 是通知虚拟机在对内存上开辟空间,new ArrayList(); 是通知虚拟机在对内存上开辟一个数组空间具体存储什么这块堆内存是不知道的,List<String> list1是将list1存储的指针指向 new出来的new ArrayList(); 是在指针入口处指定了list1 只能指向包含String的ArrayList,所以你在添加的时候其实不会保存而是在校验指针类型的时候报错。
再说List list1=new ArrayList<String>();
对于List list1=new ArrayList<String>();在new ArrayList<String>();的时候就已经为堆内存加了限制只存储String,所以任何可以转化成String类型的东西都会自动转型,而List list1的指针入口是没有限制的所以可以顺利执行。
先说List<String> list1=new ArrayList();
大家知道 new 是通知虚拟机在对内存上开辟空间,new ArrayList(); 是通知虚拟机在对内存上开辟一个数组空间具体存储什么这块堆内存是不知道的,List<String> list1是将list1存储的指针指向 new出来的new ArrayList(); 是在指针入口处指定了list1 只能指向包含String的ArrayList,所以你在添加的时候其实不会保存而是在校验指针类型的时候报错。
再说List list1=new ArrayList<String>();
对于List list1=new ArrayList<String>();在new ArrayList<String>();的时候就已经为堆内存加了限制只存储String,所以任何可以转化成String类型的东西都会自动转型,而List list1的指针入口是没有限制的所以可以顺利执行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询