ClassCastException, но все еще компилируется - PullRequest
0 голосов
/ 24 сентября 2019

Сотрудник показал мне этот код, и я знаю, что он не будет работать (на самом деле, во время выполнения выдает ClassCastException при запуске).

Я не знаю, почему он компилируется, потому что он преобразуется из java.io.FileInputStream в org.springframework.core.io.InputStreamSource;, но ни один из них не реализует одинаковые интерфейсы и не расширяет те же классы в иерархиях.

try (InputStream fileInputStream = new FileInputStream("somefile")) {

    InputStreamSource file = (InputStreamSource) fileInputStream;

    // some code

} catch (IOException e) {
    // some code
}

Ссылка соответствующих классов документации: FileInputStream , InputStreamSource

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

Потому что это явное приведение.Компилятор доверяет вам, что приведение будет валидным во время выполнения, поэтому, если это не так, произойдет сбой.

2 голосов
/ 24 сентября 2019

Я не знаю, почему он компилируется ...

Потому что это явное приведение между не final ссылочным типом и интерфейсом.Явное приведение между ссылочными типами говорит компилятору: «Послушайте, я (программист) знаю, что это приведение будет действительным во время выполнения. Поверьте мне».Так оно и есть.Конечно, позже во время выполнения, поскольку программист ошибался неправильно , он терпит неудачу.

Компилятор не вслепую доверяет программисту.Подробности в §JLS5.5 , но если компилятор может доказать , что приведение не может быть действительным, оно все равно отклонит приведение.Однако в вашем случае это невозможно, поскольку InputStreamSource - это интерфейс , а FileInputStream - это класс не final.Таким образом, FileInputStream вполне может ссылаться на некоторый объект подкласса, который реализует InputStreamSource.(Конечно, мы можем сказать, глядя на это, что это не так, поскольку просто установлено на результат new FileInputStream. Но компилятор выглядит не так уж и сложно, его волнует толькоо типах, участвующих в кастинге.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...