第23次讨论

2020年1月日15日 23.59.59截止 【第23次讨论主题:JDK版本】
1)你用过最新的JDK版本是什么?(只要用过)

jdk8
2)  最新的版本中有什么功能你觉得是惊艳到你的。

这里的“最新的版本”,我就当做是我用过的最新的JDK8了。
最惊艳的,我认为是stream 了。
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
首先流的获取(申明)方式很简单,可以通过数组,集合等方式获取到stream对象,获取到这个对象后,就
可以对数据进行一系列的操作了,比如筛选 filter,去重 distinct,截取 limit,映射 map等方法。
在流出现之前,我们对集合数据的操作,大多数都是通过手动调用方法来实现的,有了流之后,这个过程变
得更加的简单方便,代码也变得美观。


3)下一个版本JDK14有什么新功能,你比较感兴趣。

改进 NullPointerExceptions,通过准确描述哪些变量为 null 来提高 JVM 生成的异常的可用性。该提案
的作者希望为开发人员和支持人员提供有关程序为何异常终止的有用信息,并通过更清楚地将动态异常与静
态程序代码相关联来提高对程序的理解。
这个功能不管是对于新手小白,还是编程大牛,都是很有用的,所以很期待。

4)JDK发现到今天,举例说明1个例子,因为历史包袱,需要向前兼容,所以代码变得比较复杂。
这个问题,说实话我是不会的,看到前面几位老哥都是回到的泛型,我又去把泛型的知识重新回顾总结了一
下。
JDK5出的泛型,但是需要向前兼容其他的JDK版本,为了兼容不报错,Java专家们提出了类型擦除(type
erasure)的方式来解决问题。
我们先看下面的代码

public class Test4 {
    public static void main(String[] args) {
        
ArrayList<String> arrayList1=new ArrayList<String>();
        arrayList1.add("abc");
        
ArrayList<Integer> arrayList2=new ArrayList<Integer>();
        arrayList2.add(123);
        
System.out.println(arrayList1.getClass()==arrayList2.getClass());
    }


得到的结果是true,说明的问题是,程序在运行时期,不会也不能判断泛型对象的类型,这点可以简单的理
解成类型擦除,只剩下了原始类型。同时也造成了诸多问题,比如参数化类型与原始类型的兼容问题,比如
下面两行代码就编译错误了

        ArrayList<String> arrayList1=new ArrayList();
        arrayList1.add("1");//编译通过
        arrayList1.add(1);//编译错误
同时,还会有 泛型中参数化类型为什么不考虑继承关系的问题,看代码
ArrayList<String> arrayList1=new ArrayList<Object>();//编译错误
ArrayList<Object> arrayList1=new ArrayList<String>();//编译错误
为了避免这种极易出现的ClassCastException错误,Java不允许进行这样的引用传递。

ps:本次回答学到的最多的是“Java泛型”其实是伪泛型,为了向以前的版本兼容,不得不采用这种方法去
实现泛型,同时也由此引起了很多问题,更详细的原因和背景,可以看看我参考的文章
原文链接:https://blog.csdn.net/LonelyRoamer/article/details/7868820
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章