Литейный состав технически возможен . javac не может быть легко доказано, что это не так в вашем случае, и JLS фактически определяет это как действительную Java программу, поэтому пометка ошибки будет неправильной.
Это потому что List
это интерфейс. Таким образом, вы могли бы иметь подкласс Date
, который фактически реализует List
, замаскированный здесь как List
, и затем приведение его к Date
было бы совершенно нормально. Например:
public class SneakyListDate extends Date implements List<Foo> {
...
}
И затем:
List<Foo> list = new SneakyListDate();
Date date = (Date) list; // This one is valid, compiles and runs just fine
Обнаружение такого сценария может быть не всегда возможным, так как для этого потребуется информация времени выполнения, например, если экземпляр поступает из метод вместо. И даже если это потребует гораздо больше усилий для компилятора. Компилятор только предотвращает приведения, которые абсолютно невозможны из-за невозможности сопоставления дерева классов. Это не тот случай, как видно.
Обратите внимание, что JLS требует, чтобы ваш код был действительной Java программой. В 5.1.6.1. Допустимое сужающее ссылочное преобразование говорит:
Существует сужающее ссылочное преобразование из ссылочного типа S
в ссылочный тип T
, если все из следующих true :
- [...]
- Один из следующих случаев применяется :
- [...]
S
- это тип интерфейса, T
- это тип класса, а T
не называет final
класс.
Таким образом, даже если компилятор может выяснить, что ваш случай действительно доказуемо невозможен, он не может пометить ошибку, поскольку JLS определяет ее как действительную программу Java .
Было бы разрешено показывать только предупреждение.