[英]Java instanceof with class name
我只是好奇問這個,也許這是毫無意義的。
當我們在 java 中使用 instanceof 時,例如:
if (a instanceof Parent){ //"Parent" here is a parent class of "a"
}
為什么我們不能像下面這樣使用:
if (a instanceof Parent.class){
}
從嚴格編程的角度來看,第二個“instanceof”是否更有意義? “Parent”和“Parent.class”有什么區別?
“Parent”和“Parent.class”有什么區別?
后者是一個類字面量——一種訪問Class<Parent>
類型對象的方法。
前者只是一個類的名稱,它在各種情況下使用——調用靜態方法、構造函數、轉換等時。
從嚴格編程的角度來看,第二個“instanceof”是否更有意義?
好吧,不像語言定義的那樣instanceof
只適用於類型的名稱,而不適用於表達式。 如果你會寫
if (a instanceof Parent.class)
那么我希望你能寫:
Class<?> clazz = Parent.class;
if (a instanceof clazz)
... 這不是它的工作方式。 另一方面,如果需要,可以調用Class.isInstance
方法。
首先,“嚴格編程的觀點”是什么意思?
Parent
是一個類,因此第二個示例沒有第一個更有意義。 您在詢問該實例是否是該類的實例, a instanceof Parent
是對此的非常直接的表達。
Parent.class
是Class
的一個實例,所以即使第二個例子編譯了(它沒有編譯, instanceof
的右邊本身不能是一個實例),它也不會檢查你想要它檢查的內容。 :-)
Parent
是類型的名稱。 Parent.class
本質上是一個引用對象(特別是Class
的實例)的靜態變量。 你想問a
是否是Parent
類型的實例,而不是它是否是一個對象的實例,而這個對象本身就是某個其他類型(名為Class
)的實例。
我只是好奇地問這個,也許這是沒有意義的。
當我們在Java中使用instanceof時,例如:
if (a instanceof Parent){ //"Parent" here is a parent class of "a"
}
為什么我們不能像下面這樣使用:
if (a instanceof Parent.class){
}
從嚴格的編程角度來看,第二個“ instanceof”是否更有意義? “ Parent”和“ Parent.class”有什么區別?
靜態Parent.class
成員實際上是一個對象。 如果您願意,可以將其分配給Object
類型或Class
類型的變量:
Object o = Parent.class;
Class c = Parent.class;
另一方面, Parent
不是對象或變量:根據 Java 規范,它是Type Name 。
如果你能做到這一點...
a instanceof Parent.class
由於Parent.class
是一個對象,因此您也可以這樣做:
Cat myCat = new DomesticLonghair();
a instanceof myCat;
...這太愚蠢了。
正如上面所建議的,這個問題並不愚蠢!
類之間的子類關系由方法Class<?>.isAssignableFrom()
定義
if (Parent.class.isAssignableFrom(a.getClass()))
{
// a is instance of Parent or subclass
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.