Почему Java не поддерживает универсальный Throwables?

class Bouncy<T> extends Throwable {     
}
// Error: the generic class Bouncy<T> may not subclass java.lang.Throwable

Почему Java не поддерживает универсальный Throwables?

Я понимаю, что стирание типа усложняет определенные вещи, но очевидно Java уже обходится много, итак, почему бы не продвинуть его еще одна метка и позволить универсальный Throwables, со всесторонним временем компиляции проверяют на потенциальные проблемы?


Я чувствую, что аргумент стирания типа довольно слаб. В настоящее время мы не можем сделать:

void process(List<String> list) {
}

void process(List<Integer> list) {
}

Конечно, мы продвигаемся без него. Я не прошу, чтобы мы смогли сделать catch Bouncy<T1> и Bouncy<T2> в том же try блок, но если мы используем их в непересекающихся контекстах со строгим временем компиляции осуществимые правила (который является в значительной степени способом, которым дженерики работают правильно теперь), разве это не было бы осуществимо?

23
задан polygenelubricants 15 March 2010 в 04:49
поделиться

2 ответа

Спецификация языка Java 8.1.2 Generic Classes and Type Parameters:

Это ограничение необходимо, поскольку механизм перехвата виртуальной машины Java работает только с негенеративными классами.

Лично я думаю, что это связано с тем, что мы не можем получить никаких преимуществ дженериков внутри catch клаузулы. Мы не можем написать catch (Bouncy ex) из-за стирания типов, но если мы напишем catch (Bouncy ex), то делать его generic будет бесполезно.

17
ответ дан 29 November 2019 в 02:08
поделиться

Тип стирания. Тип исключения времени выполнения не имеет общей информации. Таким образом, вы не можете делать

} catch( Mistake<Account> ea) {
  ...
} catch( Mistake<User> eu) {
...
}

все, что можете - это

catch( Mistake ea ) {
  ...
}

И стирание типа - вот как было решено сохранить обратную совместимость при переходе Java с 1.4 на 1.5. Многие тогда были недовольны, и это справедливо. Но, учитывая объем развернутого кода, было немыслимо сломать код, который успешно работал в 1.4.

8
ответ дан 29 November 2019 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: