Java isInstance vs instanceOf运算符

ryb*_*bit 24 java inheritance typing rtti

整个泛型的东西有点像扔我一个循环,更多的RTT.

Specificis?啊,这里的要点是:

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

然后我会这样称呼它:

...
QueryHelper helper = QueryHelper.getQueryHelper(SomeRelatedClass.class);
...
Run Code Online (Sandbox Code Playgroud)

这样我就可以在实际帮助器中灵活地分配查询返回类型.它做了一些铸造和对象创建.我所看到的是,没有比赛,我应该以其他方式这样做吗?或者整个想法是不是很糟糕?

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

Dón*_*nal 29

这样我就可以在实际帮助器中灵活地分配查询返回类型.

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

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

它将始终返回一个实例QueryHelper.如果您希望返回类型具有灵活性,则需要将其定义为:

static <T> T getQueryHelper (Class<T> expectedReturn) {
}
Run Code Online (Sandbox Code Playgroud)

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

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

不同之处在于instanceof执行在编译时修复的类型检查,例如:

static boolean isInstance(Object myVar) {
    return (myVar instanceof Foo);
}
Run Code Online (Sandbox Code Playgroud)

将始终检查myVar是否为Foo的实例,而

static <T> boolean isInstance(Object myVar, Class<T> expectedType) {
    return expectedType.isInstance(myVar);
}
Run Code Online (Sandbox Code Playgroud)

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