Интерфейс реализации Record возвращает false при проверке с помощью instanceof (spring-boot, Java 19)

Пример кода ниже.

У меня есть запись, которая реализует интерфейс. Когда я проверяю, является ли объект типа RecordinstanceofИнтерфейс, результат есть.

Есть ли какое-то особое поведение Java с комбинацией Records/Interfaces/instanceof?

Следующий пример результатов иллюстрирует проблему.isInstanceOfостаетсяfalse, но я ожидаю, что условие и, следовательно, переменная оцениваются какtrue.

      interface Interface1 {}

record Record1(String foo) implements Interface1 {}

...

Record1 rec1 = new Record1("foo");
boolean isInstanceOf = false;

if (rec1 instanceof Interface1){
    isInstanceOf = true;
}

// isInstanceOf is still false

1 ответ

Здесь найдена основная причина проблемы: ClassCastException при приведении к тому же классу

Это не связано с записями или другими новыми функциями Java.

Проблема вызвана Spring Boot или, точнее, зависимостью, присутствующей в моем проекте. Он вводит в проект дополнительный загрузчик классов. Когда класс загружается разными загрузчиками классов, они не будут рассматриваться как принадлежащие к одному и тому же классу, хотя их каноническое имя класса на самом деле одно и то же.

В связанном вопросе это привело кClassCastExceptions, которые выглядят запутанными, например:

      com.pack.Class1 cannot be cast to com.pack.Class1

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

Однако в обоих случаях решение состоит в том, чтобы удалитьspring-boot-devtoolsзависимости или настроить его специально для ваших нужд, см. http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-devtools-customizing-classload

Другие вопросы по тегам