Java isInstance против оператора instanceOf - PullRequest
24 голосов
/ 10 ноября 2010

Все, что касается дженериков, - это что-то вроде подталкивания меня к циклу, а тем более RTT.

Specificis?Ах, ну вот суть:

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?Должен ли я использовать последний?

Ответы [ 3 ]

29 голосов
/ 10 ноября 2010

Это сделано для того, чтобы я мог по-настоящему гибко назначить тип возврата запроса в реальном помощнике.

В типе возврата этого метода нет ничего гибкого

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 является экземпляром Ожидаемый тип, но ожидается типможет быть разным типом каждый раз, когда метод вызывается

3 голосов
/ 10 ноября 2010

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;
1 голос
/ 10 ноября 2010

Ожидаемый аргумент isInstance - это объект, который может быть экземпляром класса, который представляет ваш объект класса.То, с чем вы сравниваете это, является экземпляром класса ... java.lang.Class!Так что это не будет совпадать.

например, будет истинно:

Class.class.isInstance(SomeRelatedClass.class);

Также будет верно (без архитектурного комментария о разумности фактического построения вашего помощника запросов таким образом)

expectedReturn.isInstance(new SomeRelatedClass());
...