簡體   English   中英

Class和Class的區別<!--?-->

[英]Difference between Class and Class<?>

ClassClass<?>聲明有什么區別。

  • Class a;
  • Class<?> b;

它與所有通用類型和原始類型相同:

Class          // An unknown class (raw type)
Class<?>       // An unknown class (generic version)
Class<String>  // The String class

在這種特殊情況下, ClassClass<?>之間沒有太大的實際區別,因為它們都表示未知的 class。根據現有的聲明,編譯器可以要求泛型類型而不是原始類型。

但是:從 Java 1.5 開始,您應該盡可能使用通用形式。 Class<?>明確表示您的意思是“未知類”, Class<String>明確表示您的意思是String class。原始Class可能表示兩者

最后,它對編譯器沒有太大影響,但在使代碼的意圖更易於理解和維護方面卻有很大的不同。

Class java文檔:

類型參數: T - Class object 建模的Class的類型。例如String.class的類型是Class<String> 如果正在建模的 class 未知,請使用Class<?>

在沒有類型參數的情況下使用Class類似於在沒有類型參數的情況下使用任何泛型 class( MapList等)——它要么是 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.

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