2012-02-21 8 views
2

Рассмотрим эти сортировочные функции в Java:параметр типа Java против параметра

public static <T extends Comparable<? super T>> void sort(T[] a){ 

} 

против

public static void sort(Comparable[] a){ 

} 

Есть ли разница между тем, как вы можете использовать эти методы? Может ли, например, как метод взять объект, чей суперкласс реализует подкласс сопоставимых?

Я заметил, что для второго метода редактор затмения жалуется на определение функции с помощью этого сообщения: «Сопоставимый - это необработанный тип. Ссылки на общий тип Comparable должны быть параметризованы».

ответ

4

Первый гарантирует, что все элементы массива сопоставимы друг с Другие. Второй обеспечивает только то, что все элементы реализуют Comparable.

Вы можете передать массив, содержащий экземпляры Integer, String и Date, ко второму методу, но вы не можете с первым. Первый - гораздо безопаснее.

0

Второй, как говорит вам компилятор, не имеет аргументов для родового типа. Однако вы можете просто написать

public static void sort(Comparable<?>[] a) { 
} 

, который закроет компилятор.

На самом деле нет существенной разницы между этими двумя условиями использования, за исключением того, что первая мешает вам проходить в массиве сломанных объектов, которые реализуют Comparable, где X не находится в суперклассической цепочке класса. (Класс Y реализует Сопоставимые)

С точки зрения реализации, существует важное различие в том, что вы ограничены здравом использованием Т.

Смежные вопросы