Попытка следующее:Почему ClassCastException является ошибкой во время выполнения?
class Base {
public Base(){
}
}
class Derived extends Base {
}
public class Main
{
public static void main (String[] args)
{
Derived derived = (Derived) new Base();
}
}
Вызывает CastClassException
, но успешно компилируется. Комментарии к this question предполагают, что компилятор не может понять, какой тип new Base()
имеет до выполнения - но почему так должно быть? Я знаю, что в other type systems компилятор всегда может вывести тип любого выражения, а компилятор Java, конечно же, выполняет какой-либо вывод типа, например. лямбда-выражения. И в какой-то момент он должен знать, какой тип new Base()
имеет, если он испустит правильный байт-код.
Есть ли теоретическое ограничение, препятствующее компилятору Java улавливать это до запуска программы или это выбор реализации?
Потому что это происходит во время выполнения ?? –
Casting things говорит компилятору игнорировать его собственную информацию о типе и вместо этого доверять программисту. Вот почему он этого не понимает. Компилятор говорит: «Я знаю, что это тип базы, но программист сказал, что это Derived. Они знают лучше всего». –