簡體   English   中英

帶有類名的 Java instanceof

[英]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.classClass的一個實例,所以即使第二個例子編譯了(它沒有編譯, 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.

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