2012-02-23 449 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