Не ясно, хотите ли вы выполнить проверку во время компиляции или во время выполнения. Если вы просто хотите убедиться, что параметр списка, переданный методу, содержит объекты определенного типа, переопределите T
соответствующим образом.
Например, чтобы компилятор позволял передавать этому методу только List<Comparable>
, переопределите T
как:
public <T extends Comparable<? super T>> List<T> doSth(List<T> l) {
// Method body omitted
}
Затем можно использовать перегрузку метода (вместо оператора if-else), чтобы гарантировать, что правильный код вызывается для любого значения T
. Другими словами, замените это:
public <T> List<T> doSth(List<T> l) {
if(T extends Comparable) {
// do one thing
} else {
// do another
}
return null
}
с этими:
public <T extends Comparable<? super T>> List<T> doSth(List<T> l) {
// do one thing
return null;
}
public <T> List<T> doSth(List<T> l, Class<T> clazz) {
// do another
return null;
}
Однако, вам нужно помнить выбор того, какой перегруженный метод вызывать, и проверка универсального типа выполняется только во время компиляции ! Например, следующий код:
List<? extends Serializable> alist = new ArrayList<Integer>();
doSth(alist);
фактически вызовет второй метод doSth
, поскольку параметр типа времени компиляции (? extends Serializable
) не реализует Comparable
, хотя параметр типа времени выполнения (Integer
) делает.