Преимущества различных стираний типов Java и форматов универсальных типов - PullRequest
0 голосов
/ 15 мая 2018

Я реализую библиотеку на 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 использует этот синтаксис <?>.Может кто-нибудь уточнить, как это влияет на мой код?Могу ли я внести ошибку, если я не согласен?

1 Ответ

0 голосов
/ 15 мая 2018

Ну, они должны аргументировать свое решение (или пригласить их сюда, это всегда хороший вариант). Строго говоря, они имеют смысл, но не так много.

Декларация AVLTree<K extends Comparable<? super K>, V> означает, что вы можете сравнивать детей через родителей (через ? super K). Например, ? extends CharSequence, вы можете сравнить любой CharSequence, а не просто String, например. Это стандартная декларация под знаменитой PECS .

Если честно, мне редко приходится это делать (может быть, я не слишком часто выставляю свой API), поэтому обычно делаю:

K extends Comparable<K>

Таким образом, вы не будете вносить никаких ошибок, вы просто ограничите число API, которые можно вызвать, очевидно, если вы заботитесь об этом.

С другой стороны, <?> не является новым или старым синтаксисом, он просто говорит: любого типа , ну, вы редко хотите, чтобы это IMO. Объявление такого List<?>, например, сделает его доступным только для чтения, а объекты, которые вы собираетесь получить от него, - только Object, это всего лишь более короткая версия ? extends Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...