第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
 

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