何时使用Class.isInstance()
,何时使用instanceof
运算符?
Java提供了两个选项来检查赋值兼容性。何时使用哪个?
何时使用Class.isInstance()
,何时使用instanceof
运算符?
Java提供了两个选项来检查赋值兼容性。何时使用哪个?
对于instanceof
,你需要在编译时知道确切的类。
if (foo instanceof ThisClassIKnowRightNow)
...
isInstance
方法的类在运行时确定(即延迟绑定),例如:
if (someObject.getClass().isInstance(foo))
...
.filter(ThisClassIKnowRightNow.class::isInstance)
比.filter(o -> o instanceof ThisClassIKnowRightNow)
更加简洁。请注意,翻译不包括解释或其他额外信息。 - antaktry{}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我认为官方文档已经给出了答案(虽然方式比较不具体):
该方法是Java语言instanceof运算符的动态等效版本。
我理解这意味着isInstance()
主要用于处理运行时类型反射相关代码。特别地,我可以说它存在的目的是为了处理你可能无法预先知道所需检查成员身份的类(尽管这些情况可能很少)。例如,您可以使用它来编写一个检查两个任意类型对象是否可赋值的方法,例如:
public boolean areObjectsAssignable(Object left, Object right) {
return left.getClass().isInstance(right);
}
一般来说,我建议在你预先知道要检查的类的种类时使用instanceof
。在那些极为罕见的情况下,如果你不知道要检查的类是什么,请使用isInstance()
。
isInstance
方法的另一个典型用例是处理泛型。有很多情况下,您拥有 Class<T>
对象,而唯一检查对象是否属于该类的方法是 isInstance
方法。 - RobinisInstance
的情况也可能很有帮助。例如,我试图使用 if (o.getClass().isInstance(Foo.class)) {...}
,但它没有起作用。微妙的不同之处在于需要 if (o.getClass().isInstance(new Foo)) {...}
。当您知道类型时,当然也可以使用 if (o instaneOf Foo){...}
,这可能是正确的解决方案。 - MikeT