Java: я вообще не понимаю это определение дженериков - PullRequest
1 голос
/ 01 февраля 2012

У меня есть несколько методов сортировки, которые для работы должны принять объект, для которого определено compareTo.

Следующее как часть общего определения:

private static <SomeType extends Comparable<? super SomeType>> 
    void  doSomeSort(SomeType[] a, int left, int right){

, кажется, делает трюк.

Моя проблема в том, что я не совсем понимаю, что такое
<SomeType extends Comparable<? super SomeType>>

фактически определяет.
Это означает, что вы можете заменить тип, являющийся интерфейсом, расширяющим Comparable, который создается сам по себе ...
Я не понимаю

Не могли бы вы помочь прояснить это определение?

Ответы [ 5 ]

3 голосов
/ 01 февраля 2012

Это означает:

SomeType - это класс, который расширяет Comparable<SomeType> или Comparable<Any type that is a superclass or super interface of SomeType>.

Причина ? super SomeType в том, что процедура сортировкивозможность сортировать массив экземпляров SomeType, если SomeType может сравнивать себя с другими экземплярами SomeType.Если случается, что SomeType расширяет SomeSuperType, и любой экземпляр SomeSuperType может сравнивать себя с другими экземплярами SomeSuperType, сортировка сравнивает их без проблем.

1 голос
/ 01 февраля 2012

Это переводится как:

  • тип SomeType должен расширяться или реализовывать класс Comparable
  • сам класс Comparable, в этом случае, принимает некоторый тип в качестве параметра, назовем его T.
  • тип T должен быть SomeType или суперкласс SomeType.

Классическим типом, который соответствует этому шаблону, является Integer, поскольку он реализует Comparable<Integer>.

1 голос
/ 01 февраля 2012
<SomeType extends Comparable<? super SomeType>>

Comparable всегда имеет специальный тип шаблона. Так что Comparable<String> - это то, что можно сравнить с String, Comparable<BigInteger> - это то, что можно сравнить с BigInteger и т. Д.

Здесь ожидается SomeType, полученное из Comparable<T>. Это означает, что SomeType сопоставимо с другими случаями. Самая тривиальная вещь будет

<SomeType extends Comparable<SomeType>>

Должно быть ясно до сих пор. Все, что теперь добавлено, это простое ключевое слово super. Это означает, что SomeType должен быть сопоставим со всем, что имеет тип SomeType или что-либо выше в иерархии деривации. Это в основном имеет одно преимущество: вы можете позже получить свои собственные / дополнительные типы из SomeType, и этот метод все равно будет обратно совместим! Круто, а?

Например:

class SomeTypeSuper { ... }
class SomeType extends SomeTypeSuper { ... }    

// Now, in your code both is valid:
// Asuming the method `yourMethod` expects a `<SomeType extends Comparable<? super SomeType>>` as parameter.

yourMethod(new SomeTypeSuper()); // This wouldn't be valid if we had used Comparable<SomeType>
yourMethod(new SomeType());
1 голос
/ 01 февраля 2012

В конечном счете, все, что вам действительно нужно знать, это то, что это означает:

SomeType x = ...;
SomeType y = ...;
int comparison = x.compareTo(y);

скомпилирует.

Точнее, это означает, что SomeType реализует Comparable<T> для некоторого типа T, который находится в иерархии наследования SomeType ... без необходимости указывать, что такое T, но в результате получается что код выше работает:)

0 голосов
/ 03 февраля 2012

Float является подклассом Number.Мы могли бы объявить это так:

class Float extends Number implements Comparable<Float>

Но на самом деле наш класс Float намного шире.Класс float знает, как сравнивать себя с целыми числами, Bignums, Doubles и т. Д. И т. Д. Фактически, наш класс float знает, как сравнивать себя с * any (числом.

class Float extends Number implements Comparable<Number>
class Integer extends Number implements Comparable<Number>

Фактически: любой класс чисел должен сделать это, поэтому реальное объявление sare

class Number implements Comparable<Number>
class Integer extends Number
class Float extends Number

Теперь интерфейс Comparable хорош с этим. Если бы он не был подстановочным знаком, то Floats и Integer не были быможет быть сопоставимым.

Но поскольку это так, вы можете пойти:

Comparable<Number> array[] = new Comparable<Number>[10];
array[0] = Float.getValue(10);     
array[1] = Integer.getValue(11);
sort(array, 0, 1);     

Вы не можете сделать это без>? super T>.

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