为了账号安全,请及时绑定邮箱和手机立即绑定

一个关于类型转换非常奇怪的问题

一个关于类型转换非常奇怪的问题

小怪兽爱吃肉 2019-03-15 15:15:04
public class MainTest {public static void main(String[] args){     List<Integer> a = (List<Integer>)func();     System.out.println(a); } public static List func(){     List<String> ret = new ArrayList<String>();     ret.add("hello");     return ret; } }最后竟然能输出[hello]为什么不会提示报错呢?是不是如上的类型转换只会检查最外层的类型List?
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

public static void main(String[] args)
{
List a = func();
System.out.println(a);
}

public static List func()
{
List ret = new ArrayList();
ret.add("hello");
return ret;
}

用编译工具查看生成的.class文件,还原成这样的代码!

另外java的泛型是编译时检查而已。你可以尝试
System.out.println((Integer)a.get(0)); ClassCastException就会出现了。

System.out.println((String)a.get(0));编译器会报错,不允许的。


查看完整回答
反对 回复 2019-04-26
?
慕村9548890

TA贡献1884条经验 获得超4个赞

为啥要报错呢。问题在于你强转之后啥也没做就打印一下list。
如果有数据的读取或者添加操作就会出错了。。
然后打印么,就直接call list的 toString method了。
list的toString method 应该是没有泛型安全的。

查看完整回答
反对 回复 2019-04-26
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

java泛型就是编译后都会被擦除了,泛型只是在编译前规范和验证的


查看完整回答
反对 回复 2019-04-26
  • 3 回答
  • 0 关注
  • 440 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信