2014-10-27 44 views
1

我曾嘗試:的Java:如何 「的instanceof說法」

package ro.ex;  

import java.io.IOException; 
import java.lang.reflect.Type; 

class Ex { 
    public boolean isIns(Object o, Class t) { 
     o instanceof t; 
    } 
    public static void main(String[] args) throws IOException {} 
} 

上面的代碼會引發未知的類 「T」

我的問題是:如何通過上面的代碼。

更新:

下面的代碼無法通過IntelliJ IDEA的語法檢查器

public boolean isIns(Object o, Class<?> t) { 
    return o instanceof t; 
} 

所以在思想正確的代碼是:

public boolean isIns(Object o, Class<?> t) { 
    return t.isAssignableFrom(o.getClass()); 
} 

更簡單的方法是:

package ro.ex; 

import java.io.IOException; 
import java.lang.reflect.Type; 

class Ex { 
    public boolean isIns(Object o, Class t) { 
     return t.isInstance(o); 
    } 

    public static void main(String[] args) throws IOException { 
     Object r = new Ex().isIns("", String.class); 
     System.out.println(r + "\t\t" + new Exception().getStackTrace()[0].getFileName() + ":" + new Exception().getStackTrace()[0].getLineNumber()); 
    } 
} 
+0

如何這個問題涉及到Ruby? – Surya 2014-10-27 12:29:25

+0

我不知道Java,但你有沒有嘗試:'public void IsIns (Object o)'? 。你應該指定一個* Type *,而不是一個實例 – 2014-10-27 12:30:41

+0

這通常是一個糟糕的設計的標誌,它違背了多態性的目的。研究泛型或學習如何做多態。該方法不應該返回布爾值而不是void嗎? – duffymo 2014-10-27 12:31:28

回答

6

如果你寫x instanceof t,那麼t必須是一個類。在您的isIns方法中,t不是一個類,它是一個類型爲Class的變量。

然而,類Class確實提供了一些方法,您可以使用這些方法來確定某個其他類是否是其子類:Class.isAssignableFrom(Class)。所以,你可以改變你的方法:

public boolean isIns(Object o, Class t) 
{ 
    return t.isAssignableFrom(o.getClass()); 
} 

(我也改變了你的代碼,以便被返回給調用者的結果。)

+0

OP的注意事項:如果你使用'isInstance()',那麼你不需要對'o'進行空檢查。 – 2014-10-27 13:03:35

+0

如果您不想在AndroidStudio中獲得未經檢查的通話警告,請將其設爲'Class t' – PhilipB 2017-03-16 13:38:15

0

我不知道你想用你的方法做什麼,但instanceof語法是錯誤的。

public boolean isIns(Object o, Class t) { 
     return o instanceof t; 
    } 

instanceof關鍵字檢查有效的類名稱不帶變量名稱。這是編譯器錯誤。

對於前:o instanceof String,如果你喜歡寫在下面,它不會編譯

public boolean isIns(Object o, String str) { 
     return o instanceof str; //err, o instance of String is correct way to check. 
    } 

我稍微改變了你的方法簽名相匹配的聲明。

+0

另外,你爲什麼要創建這樣的方法?使用預編譯的'instanceof'不是更容易嗎? – 2014-10-27 12:33:51

+0

應該在這裏或那裏添加一個「return」關鍵字。 :) – Henrik 2014-10-27 12:35:02

+0

@亨裏克不集中在全身。只是指導'instanceof' :)的語法。完成! – 2014-10-27 12:36:52

0

在您的代碼中,t應該是Java類的名稱(例如String)。在代碼中,你已經通過了一個變量名是不恰當的:

public void isIns(Object o, Class t) { 
    o instanceof t; 
} 

由於一個instanceof檢查是一個班輪,我不知道爲什麼你的方法加以包裝。但是,如果你堅持這樣做,也許這是你想要什麼:

public static boolean isIns(Object o, Class<?> t) { 
    return c.isInstance(o); 
} 

但有兩個注意事項:

  1. 很多instanceof檢查通常表明糟糕的設計。

  2. 看到instanceof而不是isIns(...),Java程序員會更舒服。

-1

也許你想要這樣的東西?

public class test2 { 

    class c { 
    } 

    public test2() { 
     c obj = new c(); 
     System.out.println(isIns(obj)); 
    } 

    public boolean isIns(Object o) { 
     return (o instanceof c); 
    } 

    public static void main(String argv[]) { 
     new test2(); 
    } 
} 

編輯:刪除了senceless類參數。

+0

這確實編譯。至少在我的日食。 – huidube 2014-10-27 12:42:39

+1

哦,我明白了。那麼,如果包含所有代碼,它可能會編譯,但它仍然是一個不好的例子。如果你打算忽略它,爲什麼接受一個參數'Class c'?這是我混亂的根源。 – 2014-10-27 12:44:24

+0

好吧,我仍然不知道他在問什麼。試圖做一個更好的工作副本。這一切似乎相當不穩定。但你是對的,我的例子很糟糕。要編輯它。 – huidube 2014-10-27 12:47:13