Что я делаю, используя дженерики? - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть следующий блок кода:

public static void main(String[] args) {
    Integer[] test = new Integer[100];
    comparableTest(test);
    genericsTest(test);
}

private static void comparableTest(Comparable[] c) {

}

private static <E extends Comparable<E>> void genericsTest(E[] e) { }

Что именно я делаю, используя дженерики? У обоих нет ошибок компиляции. Я все еще могу использовать метод CompareTo. Так что же я получаю, используя E extends Comparable<E> вместо Comparable?

В контексте этого вопроса я заставляю алгоритмы сортировки использовать E extends Comparable<E> вместо Comparable.

1 Ответ

6 голосов
/ 28 февраля 2020

Объяснение

  • Без обобщений вы можете получить класс, который не сопоставим с самим собой, но с другими вещами. Как и A implements Comparable<B>, это необычно, но возможно.

  • Кроме того, вы просто теряете безопасность типов на compareTo, поскольку затем возвращаетесь к принятию Object с. Таким образом, вы можете случайно совершить ошибку, передав неправильную вещь, и Java не сможет вам помочь и предотвратить ее.

На самом деле, нет никаких причин, по которым вам стоит подумать об использовании raw types (отбрасывая дженерики), если вы не обязаны разрабатывать раньше, чем Java 5.


Пример

Пример с учетом вашего фрагмента, вы передаете Integer[] в него. Integer нельзя сравнить с Dog с. Так что если вы случайно сделаете что-то глупое, например:

Dog dog = new Dog();
if (c[0].compareTo(dog) == 0) { ... }

Это на самом деле скомпилируется с вариантом, который занимает Comparable[], но создает sh во время выполнения, когда вы его выполняете. Другой вариант может обнаружить эту ошибку во время компиляции и, как правило, помочь вам обнаружить вашу ошибку намного раньше, и это хорошо.

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


Примечание

Возможно, вы захотите переименовать ваш c во что-то, что помогает удобочитаемости. Кто-то, читающий c, может не знать, что он представляет в вашем случае, может быть, это символ, может быть, машина.

В общем, старайтесь избегать сокращений. Как насчет comparables, elements или items.

...