Для объявлений общего класса и интерфейса требуются параметры типа, такие как T или U.? подстановочный знак, лучше использовать для параметров метода, которые сами являются общими:
class Foo<T extends Number & List> {
void doStuff(List<T> items) {
// ...
}
void doMoreStuff(List<? extends OutputStream> streams) {
// ...
}
}
doStuff () указывает, что он хочет работать с List<T>
, где T - параметр типа в классе Foo. Итак:
class Weird extends Number implements List {
//
}
Foo<Weird> f = new Foo<Weird>();
f.doStuff(...); // wants a List<Weird>
Если бы мы вызвали doMoreStuff () для f, мы могли бы передать что-то типа List<OutputStream>
, List<FilterOutputStream>
, List<ByteArrayOutputStream>
и т. Д.