大家来讨论下,Java中的这段代码,编译能通过吗?如果编译能通过,执行能成功吗??

大家来讨论下,Java中的这段代码,编译能通过吗?如果编译能通过,执行能成功吗??


阅读全文
请先 登录 后评论
  • 0 关注
  • 0 收藏 82 浏览
  • 略问用户 提出于 2020-10-22 17:38:21

10 个回答

xxxxxa
关于这个讨论的个人看法:1. Java中Array是协变的(covarient),但是这个特性并不好,会造成运行时错误,比如这三行代码,编译虽然能通过,但是运行时报错。 2. Java中的List(泛型)是非协变的(invarient),因此不存在这里的问题,但是又不够灵活,因此泛型用上界(upper bound)和下界(lower bound)来实现更加宽松的类型声明,即通配符(wildcard)。从这个角度来说,Java中List比Array更安全,应该多用List。 3. 另外就是一些新的编程语言比如scala有Java的前车之鉴,本身就支持了协变(covarient)和逆变(contra-variant),其实本质上也是上界和下界。 4. 可参考这个stackoverflow问答链接:https://stackoverflow.com/questions/28570877/java-covariant-array-bad
请先 登录 后评论
xxxxxa
kotlin笑而不语https://www.kotlincn.net/docs/reference/generics.html
请先 登录 后评论
xxxxxa
编译可以过,运行时抛异常
请先 登录 后评论
xxxxxa
通过不了 字符串可以提升为对象 但是数字没法提升为字符串
请先 登录 后评论
xxxxxa
数组协变
请先 登录 后评论
xxxxxa
arraystoreexception
请先 登录 后评论
xxxxxa
第三行运行会报错
请先 登录 后评论
xxxxxa
第二行已经转型,所以第三行会报错。 如果错误请指正。
请先 登录 后评论
xxxxxa
Java数组协变的一个坑,编译器认为 String是Object 的子类,所以 String[] 也是 Object 的子类,所以 objArr[0]=1 可以编译通过,但是实际运行的时候,非String 是放不进 String 类型的数组的。
请先 登录 后评论
xxxxxa
第二行那里应该执行不过去
请先 登录 后评论