2014-10-27 45 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