В продолжение моего предыдущего вопроса я пытаюсь написать метод, который будет выглядеть следующим образом.
public <T extends LivingThing> T getData(Class<T> clazz, Object otherParam) {
if(clazz instanceof Cat) {
//do something and return a new Cat
}
}
Я получаю ошибку компилятора "Несовместимые условные типы операндов" в условии if. Что я делаю не так? Как проверить тип класса в моем методе?
ОБНОВИТЬ
Хорошо, я сделал изменение кода, чтобы использовать метод 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, тогда в этом случае почему компилятор выдает ошибку?
В вашем методе 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))
instanceof
оператор работает с объектами, а не с классами.
Например, если у вас есть переменная obj
вы можете написать: obj instanceof Cat
. В вашем случае вы хотите проверить следующее: if (Cat.class.isAssignableFrom(clazz))
Попробуйте использовать 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)) {..}
isAssignableFrom
? Сравнение по строкам не только беспорядочно, но и дает неправильный ответ - "Test" instanceof Object
вернет true - ваш тест не пройдёт.
LivingThing
имеет классы методаLivingThing
такие как переопределениеCat
. Это гораздо более чистый подход. Использованиеinstanceof
- это запах кода.