何时使用Class.isInstance()方法,何时使用instanceof运算符?

54

可能重复:
Java isInstance vs instanceOf operator

何时使用Class.isInstance(),何时使用instanceof运算符?

Java提供了两个选项来检查赋值兼容性。何时使用哪个?


7
如果你要将一个问题标记为重复问题,请至少引用早期的相关问题。 - user949300
2个回答

80

对于instanceof,你需要在编译时知道确切的类。

if (foo instanceof ThisClassIKnowRightNow)
   ...

isInstance方法的类在运行时确定(即延迟绑定),例如:

if (someObject.getClass().isInstance(foo))
   ...

17
简洁地说,使用Java 8的流时,.filter(ThisClassIKnowRightNow.class::isInstance).filter(o -> o instanceof ThisClassIKnowRightNow)更加简洁。请注意,翻译不包括解释或其他额外信息。 - antak
假设在一个多重捕获的例子中,我有一个像try{}catch(A | B | C ex){//here I want to know what type (A/B/C) of exception occurs at runtime. How would we use your approach here?}这样的例子。我们该如何在这里使用你的方法来知道运行时发生了哪种类型(A/B/C)的异常? - Ram

66

我认为官方文档已经给出了答案(虽然方式比较不具体):

该方法是Java语言instanceof运算符的动态等效版本。

我理解这意味着isInstance()主要用于处理运行时类型反射相关代码。特别地,我可以说它存在的目的是为了处理你可能无法预先知道所需检查成员身份的类(尽管这些情况可能很少)。例如,您可以使用它来编写一个检查两个任意类型对象是否可赋值的方法,例如:

public boolean areObjectsAssignable(Object left, Object right) {
    return left.getClass().isInstance(right);
} 

一般来说,我建议在你预先知道要检查的类的种类时使用instanceof。在那些极为罕见的情况下,如果你不知道要检查的类是什么,请使用isInstance()


10
isInstance 方法的另一个典型用例是处理泛型。有很多情况下,您拥有 Class<T> 对象,而唯一检查对象是否属于该类的方法是 isInstance 方法。 - Robin
1
不使用 isInstance 的情况也可能很有帮助。例如,我试图使用 if (o.getClass().isInstance(Foo.class)) {...},但它没有起作用。微妙的不同之处在于需要 if (o.getClass().isInstance(new Foo)) {...}。当您知道类型时,当然也可以使用 if (o instaneOf Foo){...},这可能是正确的解决方案。 - MikeT
1
@MikeT 试试这个:MyObject.class.isInstance(Foo.class);,并查看相关帖子在这里 - Naxos84
要查看两个任意类型的对象是否可以进行赋值兼容,可以使用 isAssignableFrom() 方法。但我不知道这在2012年是否适用。 - glglgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接