绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
神奇的互换身体术--java的类型擦除
2019-12-27 10:20:37

故事背景

《互换身体》是由环球影业发行的喜剧电影,于2011年8月5日在美国上映。该片由大卫·道金执导,瑞安·雷诺兹、杰森·贝特曼、奥利维亚·王尔德等主演。该片讲述了一位居家好男人和一位蜂蝶浪子分别厌倦了自己的生活,于是在某种神秘力量的辅助下两人互换身体与生活的故事。

 

大话西游:紫霞和八戒互换了身体,欲和宝亲热,结果直接吐了

 

java的换身术

java中也可以实现神奇的魔法,比如把String放入List<Integer>或者把Integer放入List<String>.请看:

publicstaticvoid main(String[] args) {

ArrayList list =newArrayList();

list.add(1);

list.add(2);

list.add(3);

try {

list.getClass().getMethod("add", Object.class).invoke(list, "www");

} catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException

| SecurityException e) {

e.printStackTrace();

}

for(inti = 0; i < list.size(); i++) {

System.out.println(list.get(i));

}

}

打印出的结果为:

1

2

3

www

 

震惊了吗? 整数的list里面竟然有字符串!!!

类型的限定是不是没有其作用?不信的话,继续看:

publicstaticvoid main(String[] args) {

ArrayList ints =newArrayList();

ints.add(1);

ints.add(2);

ints.add(3);

ArrayList sts =newArrayList();

sts.add("a");

sts.add("b");

sts.add("c");

System.out.println(ints.getClass() == sts.getClass());

}

结果是什么呢?运行来看,结果为true

 

原来是类型擦除惹的祸。

类型擦除

当编译器对带有泛型的 Java 代码进行编译时,它会去执行类型检查和类型推断,然后生成普通的不带泛型的字节码,这种字节码可以被一般的 Java 虚拟机接收并执行,这种技术被称为擦除(erasure)。

因为种种原因,Java不能实现真正的泛型,只能使用类型擦除来实现伪泛型,这样虽然不会有类型膨胀问题,但是也引起来许多新问题,所以,SUN对这些问题做出了种种限制,避免我们发生各种错误。

编译器可以在对源程序(带有泛型的 Java 代码)进行编译时使用泛型类型信息保证类型安全,对大量如果没有泛型就不会去验证的类型安全约束进行验证,同时在生成的字节码当中,将这些类型信息清除掉。

Java 中的泛型与 C++ 模板的比较

GJ(Generic Java)程序的语法在表面上与 C++ 中的模板非常类似,但是二者之间有着本质的区别。

首先,Java 语言中的泛型不能接受基本类型作为类型参数――它只能接受引用类型。这意味着可以定义 List<Integer>,但是不可以定义 List<int>。

其次,在 C++ 模板中,编译器使用提供的类型参数来扩充模板,因此,为 List<A> 生成的 C++ 代码不同于为 List<B> 生成的代码,List<A> 和 List<B> 实际上是两个不同的类。而 Java 中的泛型则以不同的方式实现,编译器仅仅对这些类型参数进行擦除和替换。类型 ArrayList<Integer> 和 ArrayList<String> 的对象共享相同的类,并且只存在一个 ArrayList 类。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

JAVA玩具小屋
创建时间:2019-08-16 16:54:49
分享程序开发方面的小经验,思考一些比较简单易懂的技术问题
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • Yios5092
    栈主

小栈成员

查看更多
  • 栈栈
  • coyan
  • 25minutes
  • ?
戳我,来吐槽~