2010-11-10 2 views
23

Вся древовидная вещь бросает меня на цикл, а тем более RTT.Оператор Java isInstance vs instanceOf

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

ответ

29

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

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

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

+0

Ваше использование ex достаточно для isInstance назад. ОжидалосьType.isInstance (myVar); – Affe

+0

Спасибо за разъяснение, что - я решил, чтобы замедлить и думать, когда я писал этот код. С тех пор он изменился по форме, чтобы быть действительно полезным. Еще раз спасибо! – rybit

1

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

например, было бы верно:

Class.class.isInstance(SomeRelatedClass.class); 

Также было бы верно (без архитектурных комментарии к здравомыслию фактически создать свой помощник запроса таким образом)

expectedReturn.isInstance(new SomeRelatedClass()); 
3

Class.isInstance() Безразлично «Работайте так, как ожидает ваш код. Он проверяет, является ли объект, который вы передаете ему, экземпляром класса. В вашем коде:

expectedReturn.isInstance(SomeRelatedClass.class) 

Объект, который вы передаете, является объектом класса. Попробуйте вместо этого, который возвращает истину:

Class.class.isInstance(SomeRelatedClass.class); 

То, что вы, вероятно, ищет это Class.isAssignableFrom(), например:

Object.class.isAssignableFrom(Class.class); 

означает, что вы можете сделать это:

Class klass = ...; 
Object o = klass; 
Смежные вопросы