簡體   English   中英

相當於instanceof

[英]The equivalent of instanceof

不使用instanceof的等效項是什么? 使用true,false或else語句時,也許更簡單些?

public static void p (Object...ar)
{
        for (int i=0; i < ar.length; i++)
        {
                if (ar[i] instanceof int[])
                {

對於原始數組,您可以代替:

if (ar[i] instanceof int[])

采用:

if (ar[i].getClass() == int[].class)



注意:上面的代碼適用於基本類型的數組。 但是請注意, instanceof還會檢查左側的對象是否是右側的類的子類型,而==則不是。
對於對象 ,等效於(myInstance instanceof MyClass[]) (檢查子類型):

(   MyClass[].class.isAssignableFrom(  myInstance.getClass()  )   )

您可以使用:

(getClass().isArray())

並檢查整數數組:

 ar.getClass().toString().equals("class [I")

更新時間

if(ar.getClass().isArray()) {
        if(ar[i].getClass() == int[].class)
            ....
        else if(ar[i].getClass() == String[].class)
            ....
}

另一個選擇是假設它是一個int[] ,如果不是,則捕獲結果異常:

public static void p (Object...ar)
{
    for (int i=0; i < ar.length; i++)
    {
        int[] i_arr;
        try {
            i_arr = (int[]) ar[i];
        } catch (ClassCastException e) {
            continue;
        }
        //...

通常,繼承和多態是解決問題的更好方法。 不必檢查要處理的對象類型,而是要從一個通用類繼承幾個類,然后調用共享方法。

檢出具有方法isAssignableFrom(Class<?> cls) java.lang.Class。

對於數組的特定示例,它還具有isArray()getComponentType()

Class<?> intArrayCls = int[].class;

...

if (intArrayCls.isInstance(ar[i])) {

也會做到這一點。

isInstance的JavaDoc 它稍微靈活一點,因為它不僅像接受的答案一樣測試相等性。

使用isAssignableFrom

public static void test(Object... args) {
    for (int i = 0; i < args.length; i++) {
       if (args[i].getClass().isAssignableFrom(int[].class)) {
        System.out.println("true");
       } else {
            System.out.println("false");
       }
    }
}

您也可以以動態方式使用isAssignableFrom,請參閱此帖子以了解instanceof和isAssignableFrom 之間的區別instanceof和Class.isAssignableFrom(...)之間有什么區別?

暫無
暫無

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

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