Java isInstance vs instanceOf运算符

Java isInstance vs instanceOf运算符,java,inheritance,rtti,typing,Java,Inheritance,Rtti,Typing,整个泛型的事情有点让我感到困惑,RTT更是如此 具体是什么?好吧,要点如下: enum QueryHelper { query1, query2; static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) { if (expectedReturn.isInstance (SomeRelatedClass.class)) return query1; else

整个泛型的事情有点让我感到困惑,RTT更是如此

具体是什么?好吧,要点如下:

enum QueryHelper {
  query1,
  query2;
  static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
    if (expectedReturn.isInstance (SomeRelatedClass.class))
      return query1;
    else
      return query2;
  }
}
这样我就可以在实际的helper中灵活地分配查询返回类型。它进行一些铸造和对象创建。我所看到的是没有对手,我应该用其他方式来做吗?还是整个想法都不好


真正的核心是我不理解class.isInstance和instanceOf操作符之间的区别?我应该用后者吗

isInstance的预期参数是一个对象,该对象可能是您的类对象所表示的类的实例。你所比较的是这个类的一个实例
java.lang.Class
!所以它不会匹配

e、 如果是这样的话:

Class.class.isInstance(SomeRelatedClass.class);
这也是正确的(没有关于以这种方式实际构建查询助手的合理性的体系结构注释)

Class.isInstance()的工作方式与代码预期的不同。它测试传递给它的对象是否是类的实例。在您的代码中:

expectedReturn.isInstance(SomeRelatedClass.class)
您传递的对象是类对象。请改为尝试此操作,它将返回true:

Class.class.isInstance(SomeRelatedClass.class);
您可能正在寻找的是,例如:

意味着您可以这样做:

Class klass = ...;
Object o = klass;
这样我就可以在实际的helper中灵活地分配查询返回类型

此方法的返回类型没有任何灵活性

static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
    if (expectedReturn.isInstance (SomeRelatedClass.class))
      return query1;
    else
      return query2;
}
现在,返回类型是灵活的,因为它将取决于参数的类型

真正的核心是我不理解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);
}
静态布尔值isInstance(对象myVar,类expectedType){
返回expectedType.isInstance(myVar);
}

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

isInstance的使用示例是反向的。应为预期类型。isInstance(myVar);感谢您澄清这一点-在编写此代码时,我需要放慢速度并进行思考。从那以后,它的形状发生了变化,变得非常有用。再次感谢!
static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
    if (expectedReturn.isInstance (SomeRelatedClass.class))
      return query1;
    else
      return query2;
}
static <T> T getQueryHelper (Class<T> expectedReturn) {
}
static boolean isInstance(Object myVar) {
    return (myVar instanceof Foo);
}
static <T> boolean isInstance(Object myVar, Class<T> expectedType) {
    return expectedType.isInstance(myVar);
}