2012-03-27 13 views
1

Lassen Sie uns sagen, ich habe:Java Generics: eine Klasse oder Schnittstelle zu akzeptieren

public class Components<T> extends TupleList<Class<T>, String> { 

    private static final long serialVersionUID = 1L; 

    public void add(Class<T> classe, String name) { 
     this.add(new Tuple<Class<T>, String>(classe, name)); 
    } 
} 

Ich möchte in der Lage sein, Folgendes zu tun:

Components<IFilter> engines=new Components<IFilter>(){{ 
    add(FilterEngineIdentity.class, "Identity"); 
}}; 

wo FilterEngineIdentity implements IFilter. Wie würde ich dies erreichen, ohne meine Klasse Components an spezifischere Klassendefinitionen zu binden?

+0

mögliches Duplikat von [Java-Generika: Akzeptieren einer Schnittstelle in Klasse ] (http://stackoverflow.com/questions/9891216/java-generics-accepting-an-interface-in-classt) –

+0

nein kein Duplikat, Ich war in meiner Anfrage in der vorherigen Frage nicht spezifisch genug. – jldupont

+0

Können Sie wirklich diese Klasse TupleList , E> {}? – Delta

Antwort

2

Edit: Es funktioniert! Siehe meinen Test auf der Unterseite hinzugefügt.

Würde die folgende Arbeit?

Class<? extends T> 

ganze Klasse:

public class Components<T> extends TupleList<Class<?extends T>, String> { 

    private static final long serialVersionUID = 1L; 

    public void add(Class<? extends T> classe, String name) { 
     this.add(new Tuple<Class<? extends T>, String>(classe, name)); 
    } 
} 

Der Test (kompiliert ohne Probleme auf meinem Rechner, Java 1.7, aber ich habe nicht verwenden, die <> so sollte es mit anderen Versionen funktionieren):

public interface Interface {} 

public class Test<T> 
{ 
public void add(Class<? extends T> x) 
{ 

} 

public static void x() 
{ 
    Test<Interface> t = new Test<Interface>(); 
    t.add(Implementation.class); 
} 

public static class Implementation implements Interface{} 
} 
+0

Natürlich (mit ein paar kleinen Änderungen)! Vielen Dank! – jldupont

0

Nun, da ich verstehe, was Sie suchen, ich denke, das klarer und typsicher ist:

public interface Interface { 
} 

public class Test<T> { 

    public <K extends T> void add(Class<K> x) { 

    } 

    public static void x() { 
     Test<Interface> t = new Test<Interface>(); 
     t.add(Implementation.class); 
    } 

    public static class Implementation implements Interface { 
    } 
} 
+0

das ist nicht das, wonach ich gefragt habe. – jldupont

Verwandte Themen