回答
作爲pedntry的一個點,是有區別的,如果類/接口/構造/方法聲明瞭一個邊界(比extends Object
其他)。
interface Donkey<T extends Thing> { }
...
Donkey<? extends Object> foo; // FAIL
java中的所有東西都與基元的擴展對象不同,所以不會有任何區別。 Autoboxing允許使用原語,因此可以說Java中的所有東西都是一個對象。
從實驗看來,例如,List<?>
和List<? extends Object>
兩種方式都是分配兼容的,而使用其中一個方式簽名的方法可以使用另一種簽名覆蓋。例如,
import java.util.List;
class WildcardTest<T> {
public void foo(List<? extends T> bar) {}
}
class WildcardTest2 extends WildcardTest<Object> {
@Override
public void foo(List<?> bar) {super.foo(bar);}
}
<? extends Object>
是完全一樣<?>
。對不起,我沒有參考資料,但是...是的。 :)
編輯:當然,我只是從特定的角度思考,當我說。忽略我的答案(這是非常正確的downvoted),並看到真實的故事更高評分的答案。
嘿凱文,很好的碰到你。感謝您查看Executors2的東西,非常感謝。 :-)另外,請隨時查看我修改過的「非常普通的謎題」;我很想看看「官方」答案是什麼,以及我的方法是否被認爲是「作弊」。 :-P – 2010-01-06 22:21:22
哦,我不能,因爲顯然我的帖子被刪除了。 – 2010-02-01 17:22:41
從大多數人的實際情況來看,<? extends Object>
與<?>
相同,就像大家在這裏所建議的一樣。
然而,他們兩個非常小的和微妙的點不同:
的JVMS(Java虛擬機規範)具有無界通配符特殊規格,爲
ClassFileFormat-Java5
規定,無界通配符編碼爲*
同時將對象限制通配符編碼爲+Ljava/lang/Object;
。這種改變會通過分析字節碼的任何庫泄漏。編譯器編寫者也需要處理這個問題。從revisions to "The class File Format"從reifiablity的角度來看,這些是不同的。 JLS 4.6 and 4.7 codify
List<?>
作爲一種可修飾類型,但List<? extends Object>
作爲一種刪除類型。任何添加.isReifiable()
(例如mjc lib)的庫編寫者都需要考慮這一點,以遵守JLS術語。從JLS 4.6 and 4.7。
+1,謝謝!不知道! :) – missingfaktor 2010-01-07 03:39:40
很複雜......
對於任何類型的變量T
,規範說http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4
每一個類型的變量...有一個約束。如果沒有爲類型變量聲明綁定,則假定爲Object。
人們會認爲它通配符是真的太強了,?
應該只是爲? extends Object
的簡寫。
但是通過規範搜索,沒有證據表明通配符必須有上限(或下限)。 「無界的」?
一致對待有界通配符。
我們可以從子類型規則推斷,即List<?>
和List<? extends Object>
是相互的,即亞型,它們是基本上同一類型。
但是規範將它們分開處理。例如http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7List<?>
是reifiable類型,但List<? extends Object>
不是,這意味着
// ok
List<?>[] xx = {};
// fail
List<? extends Object>[] yy = {};
// ok
boolean b1 = (y instanceof List<?>);
// fail
boolean b2 = (y instanceof List<? extends Object>);
我不明白爲什麼,但。說通配符必須有一個上限和一個下限似乎很不錯,默認爲Object
和null type
。
- 1. 界通配符在Java中
- 2. 在Java中結合有界通配符
- 3. 上下界通配符的Java泛型
- 4. 具有無界通配符的Java泛型?
- 5. 下界通配符Java泛型
- 6. 下界通配符
- 7. Java泛型:無界通配符不與對象類型參數
- 8. C中有界的通配符#
- 9. Java的通用上界通配符錯誤
- 10. Java泛型:無界通配符泛化不能通過第二級
- 11. 在Java中使用無界通配符和泛型類型有什麼區別?
- 12. 泛型 - 不能添加到列表中無界通配符
- 13. 上界通用類和通配符
- 14. 無法瞭解java通配符
- 15. 上界引起編譯錯誤通配符的Java
- 16. 有界通配符的Java泛型行爲
- 17. 無界的通配符傳遞給方法
- 18. 原始類型,無界wilcard和綁定的通配符
- 19. 皈依類型集合到Java採用無界通配符等系列<?>
- 20. java通用通配符
- 21. Java的通配符超級
- 22. java中的無界列表
- 23. Java中的無界PipedInputStream
- 24. 通用通配符在Java中
- 25. .NET等價於Java有界通配符(IInterf <?>)?
- 26. (Java)如何使用有界通配符實現接口方法?
- 27. Java的HashMap的ArrayList中與通配符
- 28. 通配符在Java中的PreparedStatement
- 29. java通配符中的泛型
- 30. 瞭解Java中的通配符
哇!完全錯過了。 – notnoop 2010-01-07 01:05:42
Hawtin == smrt。 – orbfish 2011-11-08 19:08:45
該示例在javac中編譯7 – irreputable 2013-01-15 22:09:06