In realtà, è possibile fare quello che vuoi. Se si desidera fornire più interfacce o una classe più interfacce, devi avere il tuo jolly simile a questa:
<T extends ClassA & InterfaceB>
Vedi l'Generics Tutorial a sun.com, in particolare la sezione Bounded Type Parameters, in fondo alla pagina . È possibile elencare più di un'interfaccia, se lo si desidera, utilizzando & InterfaceName
per ciascuna di cui si ha bisogno.
Questo può diventare arbitrariamente complicato. Per dimostrare, vedi la dichiarazione di JavaDoc Collections#max
, che (avvolto su due righe) è:
public static <T extends Object & Comparable<? super T>> T
max(Collection<? extends T> coll)
perché così complicato? Come detto nelle FAQ di Java Generics: To preserve binary compatibility.
Sembra che questo non funzioni per la dichiarazione di variabili, ma funziona quando si imposta un limite generico su una classe. Quindi, per fare ciò che vuoi, potresti dover passare attraverso alcuni cerchi. Ma puoi farlo. Si può fare qualcosa di simile, mettendo un limite generico tua classe e poi:
class classB { }
interface interfaceC { }
public class MyClass<T extends classB & interfaceC> {
Class<T> variable;
}
per ottenere variable
che ha la limitazione che si desidera. Per ulteriori informazioni ed esempi, consulta la pagina 3 di Generics in Java 5.0. Nota, in <T extends B & C>
, il nome della classe deve venire prima e le interfacce seguono. E ovviamente puoi solo elencare una singola classe.
Ma perché devo trasmettere l'oggetto a T quando lo si restituisce? –
@BernhardV: è necessario fornire ulteriori informazioni prima di poter rispondere. In quale situazione hai bisogno di lanciare? – Eddie
Questo è utile. Vale la pena ricordare che la classe _must_ viene prima, non si può dire ''. –
EricS