Ни одна из подписей не является "правильной" подписью для этого метода, IMO. Правильная подпись должна принимать E[]
, где E extends Comparable<? super E>
:
public static <E extends Comparable<? super E>> E min (E[] arr){
E min= null;
if(arr.length > 0)
min = arr[0];
for (int i = 1; i < arr.length; i++) {
if( (arr[i].compareTo(min)) < 0)
min = arr[i];
}
return min;
}
Ваша текущая реализация неверно предполагает, что "классы, которые реализуют Comparable<T>
, должны быть T
или подклассом T
». Это не обязательно правда. Вот почему вы должны подавить эти предупреждения.
В любом случае, вернемся к вашей реальной проблеме. На стороне вызывающего абонента вы делаете B bb = min(aArr)
. В случае Comparable<E>
ошибка появляется, потому что компилятор не может определить, каким должен быть E
. Это не может быть A
, потому что A
нельзя присвоить переменной типа B
. Это также не может быть B
, потому что вы даете ему A[]
, который не является Comparable<B>[]
.
Когда вы изменили его на Comparable<? super E>
, E
может быть B
сейчас. Так как A[]
совместим с Comparable<? super B>
.
Но это работает действительно "хакерским" способом, потому что вы технически приводите каждый элемент в массиве к B
, так как E
является B
, и из-за того, как стираются Java генерики, это не дает сбоя.
root вашей проблемы действительно лежит в строке B bb = min(aArr)
. Вы делаете ошибочное предположение, что минимум aArr
имеет тип B
. Почему ты так уверен? Это также может быть A
, верно? С моим решением, приведенным выше, вам нужно привести результат к B
, если вы так уверены, что это B
:
B bb = (B)min(aArr);