我正在研究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;
}
}
有可能吗?我怎么能这样做? 请帮我。非常感谢你。
答案 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。
您应该考虑增加的复杂性是否值得。