2014-04-27 6 views
1

В продолжение моей предыдущей question, я пытаюсь написать метод, который идет как этотinstanceof не работает - что случилось с моим кодом?

public <T extends LivingThing> T getData(Class<T> clazz, Object otherParam) { 
    if(clazz instanceof Cat) { 
     //do something and return a new Cat 
    } 
} 

я получаю ошибку компиляции «Несовместимые типы условных операндов» на если условие. Что я делаю не так? Как проверить тип класса в моем методе?

UPDATE

Хорошо, я сделал изменения кода, чтобы сделать использование метода IsAssignableFrom. Вот новая проблема.

public <T extends LivingThing> List<T> getData(Class<T> classType) { 
     LivingThingEnum livingThing = LivingThingEnum 
       .getLivingThing(classType); 
     if (livingThings.keySet().contains(livingThing)) 
      return livingThings.get(livingThing); 
     return null; 
    } 
private Map<LivingThingEnum,List<? extends LivingThing>> livingThings; 

Это дает мне несоответствие типа! - «невозможно преобразовать из списка в список». Разве T не должен расширять LivingThing, тогда в этом случае почему компилятор выдает ошибку?

+2

Вы должны рассмотреть полиморфный интерфейс, где каждый 'LivingThing' имеет метод GetData классы, такие как 'Cat' override. Это гораздо более чистый подход. Использование 'instanceof' - это запах кода. –

ответ

3

Ваш метод принимает Class<T> clazzне экземпляр LivingThing.

Либо измените метод:

public <T extends LivingThing> T getData(T livingThing, Object otherParam) { 
    if(livingThing instanceof Cat) { 
     //do something and return a new Cat 
    } 
} 

Или использовать метод isAssignableFrom на Class, чтобы проверить с Class, а не например:

if(Cat.class.isAssignableFrom(clazz)) 
+0

обновил мой вопрос. Спасибо за ваш ответ – Jay

5

instanceof оператор работает на объектах, а не на классы ,

Например, если у вас есть переменная obj вы можете написать: obj instanceof Cat. В вашем случае, если вы хотите, чтобы проверить следующее: if (Cat.class.isAssignableFrom(clazz))

+0

обновите свой вопрос. Спасибо за Ваш ответ. – Jay

1

Try с Class#getName()

public static <T extends LivingThing> T getData(Class<T> clazz, Object otherParam) { 
    if (Cat.class.getName().equals(clazz.getName())) { 
     System.out.println("cat"); 
     // do something and return a new Cat 
    } 
    ... 
} 

или попробовать с Class#equals()

if (Cat.class.equals(clazz)) {..} 
+0

Что-то не так с 'isAssignableFrom'? Сравнение с строками не только беспорядочно, но и дает неправильный ответ - «Тест« instanceof Object »вернет true - ваш тест не будет. –

+0

@BoristheSpider Я отредактировал мое сообщение. – Braj

Смежные вопросы