簡體   English   中英

這些通用類型之間有什么區別

[英]What is difference between these Generic types

我有兩個問題

1.以下兩個聲明之間是否有任何區別?
(案例i)

List<String> li = new ArrayList();  

(案例ii)

List<String> li = new ArrayList<String>();  

2.我知道泛型的好處是Stronger type checks at compile time
那么為什么我們需要在case ii聲明?
由於對象創建在運行時僅在編譯時聲明。

執行的代碼沒有區別 - 但第一個表單將生成警告。 如果您沒有為泛型啟用linting,則可能會收到如下消息:

Note: Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

使用建議的標志,你會得到這樣的東西:

Test.java:6: warning: [unchecked] unchecked conversion
        List<String> li = new ArrayList();
                          ^
  required: List<String>
  found:    ArrayList
1 warning

警告的原因是它有點不安全 - 您使用原始類型的表達式( new ArrayList() )作為要分配給List<String>類型的變量的值。 編譯器不知道此原始類型值是否實際上是為了保存其他vau而最初創建的。 例如:

List numbers = new ArrayList(); // Raw types on both sides
numbers.add(Integer.valueOf(10));
List<String> li = numbers;
String first = li.get(0);

甚至:

List<Integer> numbers = new ArrayList<Numbers>();
numbers.add(Integer.valueOf(10));
List raw = numbers;
List<String> li = raw;
String first = li.get(0);

在這兩種情況下,當我們到達最后一行時,我們最終會遇到異常...而如果我們對所有表達式使用泛型類型,它甚至不會編譯:

List<Integer> numbers = new ArrayList<Numbers>();
numbers.add(Integer.valueOf(10));
List<String> li = numbers; // Compile-time error
String first = li.get(0);

原始類型僅用於向后兼容,應盡可能避免。

有關更多詳細信息,請參閱Java泛型常見問題解答

不。鑽石語法只是編碼/打字的簡寫。 這兩個是一樣的

List<String> a = new ArrayList<String>();  
List<String> a = new ArrayList<>();  

它們在編譯過程中被視為相同,提示編譯器。 即使在類型擦除之前,它們也是一樣的。 它實際上只是為您提供便利。

這兩個聲明是相同的:它們都是:

List<String>

這是兩個不同的任務

在運行時(由於類型擦除)它們也是相同的,但是在編譯時你得到第一個警告,因為你正在為一個類型變量分配一個原始類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM