2012-03-27 98 views
1

比方說,我有:Java泛型:接受類或接口

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)); 
    } 
} 

我希望能夠做到以下幾點:

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

其中FilterEngineIdentity implements IFilter。我怎樣才能達到這一點,而不需要將我的類Components綁定到更具體的類定義?

+0

可能重複的[java泛型:接受類中的接口](http://stackoverflow.com/questions/9891216/java-generics-accepting-an-interface-in-classt) – 2012-03-27 14:24:30

+0

沒有不重複,在上一個問題中,我的要求並不夠具體。 – jldupont 2012-03-27 14:25:54

+0

你真的可以做這個類TupleList ,E> {}? – Delta 2012-03-27 14:57:56

回答

2

編輯:它的工作原理!看到我的測試添加在底部。

請問以下工作?

Class<? extends T> 

全班同學:

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)); 
    } 
} 

測試(編譯沒有我的機器上的Java 1.7的問題,但我沒有使用<>所以它應該工作與其他版本精):

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

當然(稍作修改)!謝謝! – jldupont 2012-03-27 14:34:30

0

現在我明白你在找什麼,我想這是更清晰,類型安全:

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

這不是我要求的。 – jldupont 2012-03-27 14:34:19