На самом деле, вы можете делать то, что вы хотите. Если вы хотите предоставить несколько интерфейсов или интерфейсы класса плюс, вам нужно, чтобы ваш подстановочный знак выглядел примерно так:
<T extends ClassA & InterfaceB>
Смотрите Generics Учебник по sun.com, а именно Bounded Тип Параметры секции, в нижней части страницы. Вы можете перечислить несколько интерфейсов, если хотите, используя & InterfaceName
каждый из них, который вам нужен.
Это может быть сколь угодно сложно. Чтобы продемонстрировать, посмотрите декларацию JavaDoc Collections#max
, которая (заключенная в две строки):
public static <T extends Object & Comparable<? super T>> T
max(Collection<? extends T> coll)
почему так сложно? Как сказано в FAQ по Generics Java: для сохранения бинарной совместимости .
Похоже, что это не работает для объявления переменных, но работает, когда помещает общую границу в класс. Таким образом, чтобы сделать то, что вы хотите, вам, возможно, придется прыгнуть через несколько обручей. но ты можешь сделать это. Вы можете сделать что-то вроде этого, установив общую границу для вашего класса, а затем:
class classB { }
interface interfaceC { }
public class MyClass<T extends classB & interfaceC> {
Class<T> variable;
}
чтобы получить variable
то, что имеет ограничение, которое вы хотите. Для получения дополнительной информации и примеров, проверьте страницу 3 Generics в Java 5.0 . Обратите внимание, <T extends B & C>
что имя класса должно идти первым, а интерфейсы - последующими. И, конечно, вы можете перечислить только один класс.
?
в этом выражении, так это действительно «подстановочный знак»? Я спрашиваю, потому что не могу заставить работать всю концепцию «расширения двух вещей одновременно», когда параметр типа действительно является подстановочным знаком.Вы не можете сделать это с параметрами «анонимного» типа (то есть с использованием подстановочных знаков
?
), но вы можете сделать это с параметрами «именованного» типа. Просто объявите параметр типа на уровне метода или класса.источник