Кажется, instanceof не работает - что не так с моим кодом?

1

В продолжение моего предыдущего вопроса я пытаюсь написать метод, который будет выглядеть следующим образом.

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

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

3 ответа

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
    обновил мой вопрос. Спасибо за Ваш ответ
5

instanceof оператор работает с объектами, а не с классами.

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

  • 0
    обновить мой вопрос. Спасибо за Ваш ответ.
1

Попробуйте использовать 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 ? Сравнение по строкам не только беспорядочно, но и дает неправильный ответ - "Test" instanceof Object вернет true - ваш тест не пройдёт.
  • 0
    @BoristheSpider Я отредактировал свой пост.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню