美文网首页
Java为何不支持泛型的数组的原因

Java为何不支持泛型的数组的原因

作者: 值得一看的喵 | 来源:发表于2017-12-21 12:05 被阅读0次

泛型数组其实是挺严谨的,说白了就是在“编译的时候通过增加强制类型转换的代码,来避免用户编写出可能引发ClassCastException的代码”。这其实也算是Java引入泛型的一个目的。但是,一个颇具讽刺意味的问题出现了:如果允许了泛型数组,那么编译器添加的强制类型转换的代码就会有可能是错误的。

看下面的例子:

//下面的代码使用了泛型的数组,是无法通过编译的

GenTest<String> genArr[] = new GenTest<String>[2];

Object[] test = genArr;

GenTest<StringBuffer> strBuf = new GenTest<StringBuffer>();

strBuf.setValue(new StringBuffer());

test[0] = strBuf;

GenTest<String> ref = genArr[0]; //上面两行相当于使用数组移花接木,让Java编译器把GenTest<StringBuffer>当作了GenTest<String>

String value = ref.getValue();// 这里是重点!

上面的代码中,最后一行是重点。根据本文第一部分的介绍,“String value = ref.getValue()”会被替换成“String value =(String)ref.getValue()”。当然我们知道,ref实际上是指向一个存储着StringBuffer对象的GenTest对象。所以,编译器生成出来的代码是隐含着错误的,在运的时候就会抛出ClassCastException。

但是,如果没有“String value = ref.getValue();”这行代码,那么程序可以说没有任何错误。这全都是Java中多态的功劳。我们来分析一下,对于上面代码中创建出来的GenTest对象,其实无论value引用实际指向的是什么对象,对于类中的代码来说都是没有任何影响的——因为在GenTest类中,这个对象仅仅会被当作是基类型的对象(在这里也就是Object的对象)来使用。所以,无论是String的对象,还是StringBuffer的对象,都不可能引发任何问题。举例来说,如果调用valued的hashcode方法,那么,如果value指向的是String的对象,实际执行的就是String类中的hashcode方法,如果是StringBuffer的对象,那么实际执行的就是StringBuffer类中的hashcode方法。

从这里可以看出,即使支持泛型数组也不会带来什么灾难性的后果,最多就是可能引发ClassCastException。而且平心而论,这个还是程序员自己的错误,实在算不得是Java编译器的错误。但是从另一个角度看,这确实是个巨大的讽刺:泛型是为了消灭ClassCastException而出现的,但是在这个时候它自己却引发了ClassCastException。咱们中国人把这个叫做搬起石头砸自己的脚。

当然制定JSR的那帮子人可能没学过中文,但是他们肯定是发现了这个令他们纠结的问题。被标榜为Java 5重要feature的泛型竟然陷入了这么一个怪圈。于是,他们在某个月黑风高的晚上,在某个角落的会议室内,悄悄的决定一不做二不休——不支持泛型的数组了。

相关文章

  • scala 与 java泛型数组

    java 泛型数组初始化 使用这样的方式初始化java的数组会出错,因为java不支持泛型数组。按照我的理解,ja...

  • [Java菜鸟系列] 泛型数组的问题是「体制」问题

    J006-[Java菜鸟系列] 泛型数组的问题是「体制」问题 菜鸟:Java为什么不支持泛型数组? 老湿:上一次提...

  • 九、泛型

    九、泛型 尽量不要写这种有能与泛型方法重载的代码,有迷惑性 限定传入 T 的类型 泛型数组 Java 不支持泛型类...

  • Java为何不支持泛型的数组的原因

    泛型数组其实是挺严谨的,说白了就是在“编译的时候通过增加强制类型转换的代码,来避免用户编写出可能引发ClassCa...

  • 泛型 - 通配符

    使用通配符的原因:Java中的数组是协变的,但是泛型不支持协变。 数组的协变 首先了解下什么是数组的协变,看下面的...

  • Java - 泛型数组

    Java不允许创建泛型数组的原因 Quora - Why-does-Java-prohibit-generic-a...

  • Android 开发也要掌握的Java知识 - Java泛型

    如果需要看泛型擦除Java泛型擦除 1.Java泛型有什么用?为啥要使用泛型? Java中数组的类型是定义的时候就...

  • Java 不支持泛型数组

    在工作中,用到了泛型数组: 但是编译器一直报error: 差了一些资料,整理出来以供参考。 为什么会有泛型 通过使...

  • Kotlin 泛型中的 in 和 out

    协变 在 Java 的泛型系统中. 泛型默认是不支持协变(covariant). 也就是说在 Java 中. 即使...

  • Java自学-泛型 支持泛型的类

    Java 如何设计支持泛型的类 步骤 1 : 不支持泛型的Stack 以Stack栈为例子,如果不使用泛型当需要一...

网友评论

      本文标题:Java为何不支持泛型的数组的原因

      本文链接:https://www.haomeiwen.com/subject/ynaowxtx.html