2012-02-23 134 views
1

可能重複:
Instantiating a generic class in Java使用泛型類型的Java創建對象

我學習泛型的Java,因爲我想實現這一點:

我有2個班使用1個普通類,並且在這個普通類中我想創建一個泛型類的對象。這裏有一段我​​的代碼,所以它會是最簡單的。

//MyFirstClass.java 
class MyFirstClass{ 
    ... 
    MyExpandableListAdapter<FirstFilter> mAdapter = new MyExpandableListAdapter<FirstFilter>(); 
    ... 
} 

//MySecondClass.java 
class MySecondClass{ 
    ... 
    MyExpandableListAdapter<SecondFilter> mAdapter = new MyExpandableListAdapter<SecondFilter>(); 
    ... 
} 

//common class MyExpandableListAdapter.java 
public class MyExpandableListAdapter<E extends Filter> extends BaseExpandableListAdapter implements Filterable { 
    private E filter; 
    ... 
    public Filter getFilter(){ 
     if (filter== null) 
      filter = new <E>(); // Here I want to create an Object, but I get an error on <E> 
     return filter; 
    } 
} 

是否可以做到這一點?我怎麼能做到這一點? 請幫幫我。非常感謝你。

回答

2

由於其通用的實現方式,這是完全不可能的,因爲你想在這裏做實例化一個泛型參數。

通常的選擇是使用一些工廠,即實施與接口的類:

interface Factory<E> { 
    E newInstance(); 
} 

這樣,你必須在工廠的不同實現不同版本的E,編譯器會檢查你是否傳入了正確的類型。

+1

非常感謝你,我已經解決了你的幫助:)祝你有美好的一天;) – sleone08 2012-02-27 09:39:34

1

您在運行時無法以您想要的方式訪問E.你能砍解決這個問題,但它是一個有點亂:

protected Class<E> filterClass; 

@SuppressWarnings("unchecked") 
public MyExpandableListAdapter() { 
    filterClass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
} 

之後,你有,你可以使用反射來創建一個實例的類。見this tutorial for more information

您應該考慮增加的複雜性是否值得。

+0

非常感謝。我已經解決了使用Andrzej Doyle發佈的解決方案。我認爲我會嘗試你的想法,好奇:) 這是另一個很好的解決方案:)祝你有美好的一天;) – sleone08 2012-02-27 09:41:41