Преобразование суперкласса в субкласс передает instanceof, но встречает ClassCastException - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть два объекта, User и CustomUserDetails, который расширяет User и реализует org.springframework.security.core.userdetails.UserDetails;

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

public User findByUsername(String username) {
    CustomUserDetails customUserDetails = new CustomUserDetails();
    User user = em.createQuery("from User where username = :username", User.class)
            .setParameter("username", username).getSingleResult();

    System.out.println(user.toString());

    if(customUserDetails instanceof User) {
        System.out.println("CustomUserDetails instance of User");
        customUserDetails = (CustomUserDetails) user;
        return customUserDetails;
    } else {
        System.out.println("CustomUserDetails is not instance of User");
        throw new ClassCastException();
    }
}

Вот мой вывод на консоль

ID: 1, USERNAME : joe.bloggs@example.com, PASSWORD: gojoe, LIST<ROLE>: ROLE_ADMIN
CustomUserDetails instance of User
java.lang.ClassCastException: model.User cannot be cast to model.CustomUserDetails

Почему я не могу перейти от Пользователя к CustomUserDetails, даже если я прошел проверку экземпляра? Класс интерфейса UserDetails мешает успешному приведению?

1 Ответ

0 голосов
/ 25 апреля 2018

Вы пытаетесь разыграть

customUserDetails = (CustomUserDetails) user;

, но пользователь не является экземпляром этого, пользователь является экземпляром пользователя.Попробуйте добавить геттер в класс User, чтобы получить CustomUserDetails, или используйте if(user instanceof CustomUserDetails){...

...