Wildcarding di Java Generics con classi multiple

Voglio avere un object Class, ma voglio forzare qualsiasi class rappresenti per estendere la class A e implementare l’interfaccia B.

Posso fare:

Class 

O:

 Class 

ma non posso fare entrambe le cose. C’è un modo per fare questo?

In realtà, puoi fare quello che vuoi. Se si desidera fornire più interfacce o interfacce di class e plus, è necessario che il carattere jolly sia simile a questo:

  

Vedere il tutorial generico su sun.com, in particolare la sezione Parametri del tipo limitato, nella parte inferiore della pagina. Puoi effettivamente elencare più di un’interfaccia se lo desideri, usando & InterfaceName per ognuno di cui hai bisogno.

Questo può diventare arbitrariamente complicato. Per dimostrare, vedere la dichiarazione JavaDoc di Collections#max , che (racchiusa su due righe) è:

 public static > T max(Collection coll) 

perché così complicato? Come detto nelle FAQ di Java Generics: preservare la compatibilità binaria .

Sembra che questo non funzioni per la dichiarazione delle variabili, ma funziona quando si mette un limite generico su una class. Quindi, per fare ciò che vuoi, potresti dover passare attraverso alcuni cerchi. Ma puoi farlo. Puoi fare qualcosa di simile, mettendo un limite generico sulla tua class e poi:

 class classB { } interface interfaceC { } public class MyClass { Class variable; } 

per ottenere una variable che ha la restrizione che desideri. Per ulteriori informazioni ed esempi, consulta la pagina 3 di Generics in Java 5.0 . Nota, in , il nome della class deve venire prima e le interfacce seguono. E ovviamente puoi solo elencare una singola class.

Non puoi farlo con parametri di tipo “anonimo” (cioè, i caratteri jolly che usano ? ), Ma puoi farlo con i parametri di tipo “named”. Dichiara semplicemente il parametro type a livello di metodo o di class.

 import java.util.List; interface A{} interface B{} public class Test> { T t; }