簡體   English   中英

元類Type和元類Java中的元類Class有什么區別?

[英]What is the difference between the metaclass Type and the metaclass Class in Java?

元類Type和元類Java中的元類Class有什么區別? 在使用反射編程時我應該什么時候使用其中之一?

class Class的實例表示正在運行的 Java 應用程序中的類和接口,但也具體化 arrays 和原始類型。

我知道從 Java 1.5 開始,反射 API 被擴展為處理泛型 arrays、參數化類型、類型變量……等等。 我假設這是Type元類的主要和唯一目的?

TypeClass之間的區別是否仍然保留在語言設計中,而不是向后兼容的原因?

Type是一個比較通用的概念, Class只是其中的一種。 意思是Class是一個Typeextends Type ),但也有其他類型的Type

例如, ParameterizedTypeType ,但不是Class ,因為沒有Class實例表示泛型類型(即List<String>.class不是有效的 Java)。 例如ListClassString是 class,但List<String>ParameterizedType ,原始類型為Class (表示List ),另一個Class (表示String )作為其(唯一)類型參數。
它當然可以更復雜, Map<String, List<String>ParameterizedType具有Class ( Map ) 作為其原始類型,2 個類型參數,其中一個是Class ( String ),而另一個是另一個ParameterizedType ,具有自己的原始類型和類型參數。

還有Type的其他子類型,比如類型變量—— List<T>中的T 、通配符—— ? List<?>

所以Type是 Java 類型系統中各種類型的通用超級接口——類、泛型類型、通配符、類型變量……類型,例如,可以分層嵌套,形成一棵樹,而Class是一個類型那就是這樣一棵樹的葉子。

這是可視化的類型層次結構( Class下的框不是真正的子類型,但邏輯上屬於那里,所以這是一個很好的心智模型):

類型層次結構

另請注意,除Class之外的Type只能通過反射檢查字段和方法的簽名來獲得,而不是 object實例,因為 Java 編譯器會在那里擦除 generics。 您可以從實例中獲得的唯一信息是它的Class (例如listOfStrings.getClass() ),實例上的所有其他類型信息都將丟失。

可能還需要指出的是,自 Java 8 以來,還有AnnotatedType層次結構,它反映了Type層次結構,但是使用注釋對類型進行建模,例如List<@Positive Integer>注釋參數類型是表示@Positive Integer AnnotatedType @Positive Integer ,它與@Negative IntegerInteger不同。

暫無
暫無

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

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