【问题标题】:Java isInstance vs instanceOf operatorJava isInstance 与 instanceOf 运算符
【发布时间】:2010-11-10 00:15:06
【问题描述】:

整个泛型有点让我陷入循环,RTT 更是如此。

具体的?嗯,这是要点:

enum QueryHelper {
  query1,
  query2;
  static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
    if (expectedReturn.isInstance (SomeRelatedClass.class))
      return query1;
    else
      return query2;
  }
}

然后我会这样称呼它:

...
QueryHelper helper = QueryHelper.getQueryHelper(SomeRelatedClass.class);
...

这样我可以真正灵活地在实际助手中分配查询返回类型。它进行一些转换和对象创建。我看到的是没有匹配,我应该以其他方式这样做吗?还是整个想法很糟糕?

真正的核心是我不明白 class.isInstance 和 instanceOf 运算符之间的区别?我应该使用后者吗?

【问题讨论】:

    标签: java inheritance rtti typing


    【解决方案1】:

    这样我可以真正灵活地在实际助手中分配查询返回类型。

    这个方法的返回类型没有什么灵活的地方

    static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
        if (expectedReturn.isInstance (SomeRelatedClass.class))
          return query1;
        else
          return query2;
    }
    

    它总是会返回一个QueryHelper 的实例。如果您希望返回类型灵活,则需要将其定义为:

    static <T> T getQueryHelper (Class<T> expectedReturn) {
    }
    

    现在返回类型是灵活的,因为它取决于参数的类型

    而真正的核心是我不明白 class.isInstance 和 instanceOf 运算符之间的区别?

    不同之处在于 instanceof 会在编译时进行类型检查,例如:

    static boolean isInstance(Object myVar) {
        return (myVar instanceof Foo);
    }
    

    将始终检查 myVar 是 Foo 的一个实例,而

    static <T> boolean isInstance(Object myVar, Class<T> expectedType) {
        return expectedType.isInstance(myVar);
    }
    

    将检查 myVar 是否为 expectedType 的实例,但每次调用方法时,expectedType 都可以是不同的类型

    【讨论】:

    • 您对 isInstance 的使用示例是落后的。将是预期Type.isInstance(myVar);
    • 感谢您澄清 - 我在编写此代码时需要放慢速度并思考。从那以后,它的形状发生了变化,变得真正有用​​了。再次感谢!
    【解决方案2】:

    Class.isInstance() 不像您的代码所期望的那样工作。它测试您传递给它的对象是否是该类的实例。在你的代码中:

    expectedReturn.isInstance(SomeRelatedClass.class)
    

    您传递的对象是一个 Class 对象。试试这个,它返回 true:

    Class.class.isInstance(SomeRelatedClass.class);
    

    您可能正在寻找的是Class.isAssignableFrom(),例如:

    Object.class.isAssignableFrom(Class.class);
    

    表示您可以这样做:

    Class klass = ...;
    Object o = klass;
    

    【讨论】:

      【解决方案3】:

      isInstance 的预期参数是一个对象,它可能是您的类对象所代表的类的实例。您将其与该类的实例进行比较...java.lang.Class!所以它不会匹配。

      例如,会是真的:

      Class.class.isInstance(SomeRelatedClass.class);
      

      也是如此(没有关于以这种方式实际构建查询助手的合理性的架构评论)

      expectedReturn.isInstance(new SomeRelatedClass());
      

      【讨论】:

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