class Bouncy<T> extends Throwable {
}
// Error: the generic class Bouncy<T> may not subclass java.lang.Throwable
Почему Java не поддерживает универсальный Throwable
s?
Я понимаю, что стирание типа усложняет определенные вещи, но очевидно Java уже обходится много, итак, почему бы не продвинуть его еще одна метка и позволить универсальный Throwable
s, со всесторонним временем компиляции проверяют на потенциальные проблемы?
Я чувствую, что аргумент стирания типа довольно слаб. В настоящее время мы не можем сделать:
void process(List<String> list) {
}
void process(List<Integer> list) {
}
Конечно, мы продвигаемся без него. Я не прошу, чтобы мы смогли сделать catch Bouncy<T1>
и Bouncy<T2>
в том же try
блок, но если мы используем их в непересекающихся контекстах со строгим временем компиляции осуществимые правила (который является в значительной степени способом, которым дженерики работают правильно теперь), разве это не было бы осуществимо?
Спецификация языка Java 8.1.2 Generic Classes and Type Parameters:
Это ограничение необходимо, поскольку механизм перехвата виртуальной машины Java работает только с негенеративными классами.
Лично я думаю, что это связано с тем, что мы не можем получить никаких преимуществ дженериков внутри catch
клаузулы. Мы не можем написать catch (Bouncy
из-за стирания типов, но если мы напишем catch (Bouncy ex)
, то делать его generic будет бесполезно.
Тип стирания. Тип исключения времени выполнения не имеет общей информации. Таким образом, вы не можете делать
} catch( Mistake<Account> ea) {
...
} catch( Mistake<User> eu) {
...
}
все, что можете - это
catch( Mistake ea ) {
...
}
И стирание типа - вот как было решено сохранить обратную совместимость при переходе Java с 1.4 на 1.5. Многие тогда были недовольны, и это справедливо. Но, учитывая объем развернутого кода, было немыслимо сломать код, который успешно работал в 1.4.