使用泛型类型Java创建对象

时间:2012-02-23 10:51:50

标签: java generics

  

可能重复:
  Instantiating a generic class in Java

我正在研究Generics Java,因为我想实现这个:

我有2个使用1个公共类的类,在这个公共类中,我想创建一个泛型类的Object。这里有一段我​​的代码所以最简单。

//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 个答案:

答案 0 :(得分:2)

由于实现泛型的方式,完全不可能像在这里尝试那样实例化泛型参数。

通常的替代方法是使用某种工厂,即实现类似于:

的接口的类
interface Factory<E> {  
    E newInstance();
}

这样,对于E的不同版本,您将拥有不同的工厂实现,并且编译器会检查您是否传递了一个正确的类型。

答案 1 :(得分:1)

您无法在运行时以您希望的方式访问E.你可以解决这个问题,但它有点乱:

protected Class<E> filterClass;

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

获得课程后,您可以使用反射来创建实例。请参阅this tutorial for more information

您应该考虑增加的复杂性是否值得。