[英]What is the difference between <> and <?> in Java generic types?
[英]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.