Объяснение
Без обобщений вы можете получить класс, который не сопоставим с самим собой, но с другими вещами. Как и 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
.