【问题标题】:Java instanceof operatorJava instanceof 运算符
【发布时间】:2012-07-29 21:28:33
【问题描述】:

是否有可以与instanceof 运算符一起使用的有效类类型变量?例如:

String s = "abc";

Class<?> classType = String.class;

if (s instanceof classType) {
    //do something
}

作为替代方案:

if (s.getClass() == classType) {
    //do something
}

会有任何性能优势吗?

【问题讨论】:

    标签: java instanceof comparison-operators


    【解决方案1】:

    您所做的实际上并不相同。考虑一下子类会发生什么(我知道你不能子类String,所以在String 的情况下没关系)。

    class A {}
    class B extends A {}
    
    B b = new B();
    b instanceof A // true
    b.getClass() == A.class // false
    

    如果你有一个对象,你想知道它是否是某个类型的实例并且你有Class对象,你可以使用Class#isInstance方法。

    在任何一种情况下,我都希望性能差异微不足道。

    【讨论】:

    • 所以 X.class.isInstance(objectX) 比 objectX instanceof X 快吗?
    • 它们是不同的。如果您有类类型,则使用第一个,因为您不能执行 objectX instanceof xClass。当您要检查的类在编译时未知时,它有助于动态检查。
    • 我不确定我是否清楚,可以这样说:java.lang.String.cass.isInstance(objectX) 与 objectX instanceof java.lang.String 相比。你说哪个更快?
    • 我猜测 instanceof 是因为它是一个内置的 java 构造,但您可以运行一些测试来找出答案。
    • b.getClass() = A.class // false 应该是 b.getClass() == A.class // false (== 而不是 =)
    【解决方案2】:

    还有

    Class<?> classType = String.class;
    
    if (classType.isInstance(s)) {...
    

    至于性能,我希望这些之间的差异可以忽略不计。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多