Вы написали в комментарии:
Я думаю, что нет причины для <Ackr extends Cloneable>
, но в каком контексте эта конструкция будет иметь смысл?
Этопараметр типа для вашего метода.
public <Ackr extends Cloneable> Ackr getInstance(){ ... }
определяет метод, который возвращает объект некоторого типа (выбираемый вызывающей стороной), который расширяет Cloneable.Этот метод может только легально вернуть null
(поскольку у вас нет способа узнать, какой тип выбрал вызывающий объект, а null
является единственным значением, общим для всех ссылочных типов), или выдать исключение, поэтому он не очень полезен.
Параметр типа Ackr
здесь не имеет отношения к вашему перечисляемому классу с тем же именем, поэтому вам лучше написать его так:
public <A extends Cloneable> A getInstance(){ ... }
В Java API есть несколько примеров, которыеесть такие варианты использования параметров типа, которые используются только в возвращаемом типе, но затем они возвращают некоторый параметризованный тип (а параметр типа метода используется в качестве параметра типа для возвращаемого типа).Ищите, например, Collections.emptySet()
.
Чаще всего параметры типа метода используются в типах параметров метода (только или дополнительно к возвращаемому типу).
public <A> A getFirstElement(Iterable<A> list);
Этот метод принимает Iterable некоторого типа A и возвращает объект этого типа A. (Из названия можно было бы предположить, что он берет первый элемент этого итерируемого.) Вот реализация:
public <A> A getFirstElement(Iterable<A> list) {
Iterator<A> it = list.iterator();
if(it.hasNext()) {
return it.next();
}
return null;
}
Обычно: Если у вас есть параметр типа (где-либо), убедитесь, что вы не называете его так же, как какой-либо существующий тип (как вы сделали здесь) - он будет затенять ваш существующий тип, приводяк большой путанице из-за странных сообщений об ошибках, таких как Ackr не может быть назначен Ackr .
По этой причине параметры типа причины часто имеют одно (или редко два) имен символов, таких как E
(элемент-тип), K
, V
(тип ключа и значения для карт), T
(тип в целом).