Я реализую библиотеку на Java, используя дженерики.Насколько я понимаю, универсальные типы были введены позже в Java, чтобы обеспечить функцию, аналогичную шаблонам в C ++, и при этом поддерживать обратную совместимость.При этом параметризованный тип AVLTree<K, V>
во время выполнения просто выглядит как AVLTree
, отсюда и название «стирание типа».
Я обнаружил, что следующие три способа написания моего определения класса эквивалентны в том смысле, что компилятор не жалуется, и при этом я не получаю каких-либо странных проблем во время выполнения, связанных с типами.Я не использую рефлексию, поэтому я не видел выгоды в этой области.
Мне сказали НЕ использовать это:
AVLTree<K extends Comparable<K>, V>
Вместо этого они говорят, ИСПОЛЬЗУЙТЕ это:
AVLTree<K extends Object & Comparable<? super K>, V>
Но с этим тоже все в порядке:
AVLTree<K extends Comparable<? super K>, V>
Я читал, что если вы можете избежать использования SomeClass<E>
, вам следует, и более новая Java использует этот синтаксис <?>.
Может кто-нибудь уточнить, как это влияет на мой код?Могу ли я внести ошибку, если я не согласен?