Na verdade, você pode fazer o que quiser. Se você deseja fornecer várias interfaces ou uma classe mais interfaces, você deve ter seu curinga parecido com este:
<T extends ClassA & InterfaceB>
Consulte o Tutorial sobre genéricos em sun.com, especificamente a seção Parâmetros de tipo limitado , na parte inferior da página. Você pode realmente listar mais de uma interface, se desejar, usando & InterfaceName
para cada uma que precisar.
Isso pode ser arbitrariamente complicado. Para demonstrar, consulte a declaração JavaDoc de Collections#max
, que (agrupada em duas linhas) é:
public static <T extends Object & Comparable<? super T>> T
max(Collection<? extends T> coll)
por que tão complicado? Como dito nas Perguntas frequentes sobre Java Generics: Para preservar a compatibilidade binária .
Parece que isso não funciona para declaração de variáveis, mas funciona ao colocar um limite genérico em uma classe. Assim, para fazer o que quiser, você pode ter que pular algumas voltas. Mas você consegue fazer isso. Você pode fazer algo assim, colocando um limite genérico em sua classe e depois:
class classB { }
interface interfaceC { }
public class MyClass<T extends classB & interfaceC> {
Class<T> variable;
}
para obter variable
isso tem a restrição que você deseja. Para obter mais informações e exemplos, consulte a página 3 de Genéricos em Java 5.0 . Observe que, em <T extends B & C>
, o nome da classe deve vir primeiro e as interfaces seguem. E, claro, você pode listar apenas uma única classe.
?
nessa expressão, então é realmente um "curinga"? Eu pergunto porque não consigo que o conceito "estendendo duas coisas ao mesmo tempo" funcione quando o parâmetro type é realmente um curinga.Você não pode fazê-lo com parâmetros do tipo "anônimo" (ou seja, curingas que usam
?
), mas pode fazê-lo com parâmetros do tipo "nomeado". Simplesmente declare o parâmetro type no método ou no nível da classe.fonte