[英]Difference between Class and Class<?>
Class
和Class<?>
聲明有什么區別。
Class a;
Class<?> b;
它與所有通用類型和原始類型相同:
Class // An unknown class (raw type)
Class<?> // An unknown class (generic version)
Class<String> // The String class
在這種特殊情況下, Class
和Class<?>
之間沒有太大的實際區別,因為它們都表示未知的 class。根據現有的聲明,編譯器可以要求泛型類型而不是原始類型。
但是:從 Java 1.5 開始,您應該盡可能使用通用形式。 Class<?>
明確表示您的意思是“未知類”, Class<String>
明確表示您的意思是String
class。原始Class
可能表示兩者。
最后,它對編譯器沒有太大影響,但在使代碼的意圖更易於理解和維護方面卻有很大的不同。
Class java文檔:
類型參數:
T
- Class object 建模的Class
的類型。例如String.class
的類型是Class<String>
。 如果正在建模的 class 未知,請使用Class<?>
。
在沒有類型參數的情況下使用Class
類似於在沒有類型參數的情況下使用任何泛型 class( Map
、 List
等)——它要么是 1.5 之前的遺留用法,要么只是一段不關心未經檢查的類型轉換的代碼.
Class <?>
表明您有意編寫 Java 5 級代碼,這些代碼不知道或不關心您正在處理的 class 是什么。 遺漏使它看起來像舊代碼或由尚未學習 generics 的人編寫的代碼。
“它看起來像舊代碼或由尚未學習 generics 的人編寫的代碼。” 這是正確的說法。 Class(發音為“class of unknown”),即 class,其類型匹配任何內容。 出於顯而易見的原因,它被稱為通配符類型。
例如:
public void drawAll(List<Shape> shapes) {
for (Shape s: shapes) {
s.draw(this);
}
}
類型規則說 drawAll() 只能在完全Shape
的列表上調用:例如,它不能在List<Circle>
上調用。 不幸的是,因為所有方法所做的都是從列表中讀取形狀,所以它也可以在List<Circle>
上調用。
我們真正想要的是讓方法接受任何形狀的列表。
public void drawAll (List <? extends Shape> shapes) {
}
閱讀更多: http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.