Интерфейс реализации 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 или, точнее, зависимостью, присутствующей в моем проекте. Он вводит в проект дополнительный загрузчик классов. Когда класс загружается разными загрузчиками классов, они не будут рассматриваться как принадлежащие к одному и тому же классу, хотя их каноническое имя класса на самом деле одно и то же.
В связанном вопросе это привело кClassCastException
s, которые выглядят запутанными, например:
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