[英]Incomparable types: java.lang.Class<capture#1 of ? extends T[]> and java.lang.Class<java.lang.Object[]>
[英]java.lang.Class and java.lang.Object
好的概念上的困難 - 從書中閱讀和學習Java
它提到了以下內容(在解釋幾個不同主題的過程中) -
Java不支持類層次結構中的多重繼承。 因此,如果C類是A類的子類,那么它也不能是B類的子類(我知道接口有一個解決方案可以在這里提供)
java.lang.Object
是所有類(系統和用戶)'擴展'的原始類。 所以每個類都是java.lang.Object
類的直接或間接子類
Java中的類不僅僅是編譯器偽像 - 但在運行時,由java.lang.Class
類的實例表示
不是#3意味着語言本身定義的類是java.lang.Class
類型 - 而#2意味着它們也是java.lang.Object
類型 - 與#1相矛盾? 喜歡哪個類是java類的子類?
如果#1仍然存在,我猜這將意味着#3只是說類的“運行時表示”是類java.lang.Class
實例 - 它是java.lang.Object
的子類,但是類本身是java.lang.Object
子類?
非常感謝您的指導!! 提前致謝!
不是#3意味着語言中定義的類本身是
java.lang.Class
類型
No. (Class) testclass
是語法錯誤 - 沒有類是java.lang.Class
子類 - 它是final
。
Class
擴展了Object
並代表了一個class
。
比方說,我有TestClass
延伸Object
默認情況下,現在TestClass.class
或(TestClass).getClass()
存在-他們返回Class<TestClass>
它擴展了Object
,是一個實例Class
。
3)Java中的類不僅僅是編譯器工件 - 但在運行時,由java.lang.Class類的實例表示
那是正確的。
不是#3意味着語言中定義的類本身是java.lang.Class類型
那是正確的。
而#2意味着它們也是java.lang.Object類型
那是正確的。
......與#1相矛盾?
那是不對的。 沒有矛盾。
“擴展”關系僅在類之間定義,並且在運行時表示類的Class
對象之間定義。 如果查看java.lang.Class
API,您將看到Class getSuperclass()
和isAssignableFrom(Class)
...雖然isAssignableFrom
正在測試“子類型”關系。 請注意,這些方法將另一個Class作為參數,或返回另一個類。
類和實例之間沒有“繼承”或“擴展”關系。 並且運行時對象之間也沒有這種關系。 java.lang.Class
擴展java.lang.Object
這一事實與此無關。
如果#1仍然存在,我猜這將意味着#3只是說類的“運行時表示”是類java.lang.Class的實例 - 它是java.lang.Object的子類?
那是正確的。
....但是類本身是java.lang.Object的子代碼?
那也是對的。
但需要注意的是,這兩個屬性並不直接相互關聯。 (類似)巧合的是,類和表示類的運行時類之間存在類似的關系。
3)Java中的類不僅僅是編譯器工件 - 但在運行時,由java.lang.Class類的實例表示
這是不正確的。 Java對象是對象 。 它們還有一個表示其類類型的屬性 。
public class Test {
public static final void main(String[] ignored) {
String s = "x";
Class cls = s.getClass();
System.out.println("s=" + s.toString());
System.out.println("cls=" + cls.toString());
}
}
輸出:
s=x
cls=class java.lang.String
令人困惑的是我們說“Java對象就是類”。 這些在一般意義上都是正確的,但是使用這個特定的技術細節,它是不准確的。
簡而言之,Java對象存儲在*.class
文件中,這使得這種區分變得混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.