使用泛型类型Java创建对象
可能重复:使用泛型类型Java创建对象,java,generics,Java,Generics,可能重复: 我正在学习Java泛型,因为我想实现这一点: 我有两个类使用一个公共类,在这个公共类中我想创建一个泛型类的对象。这里有一段我的代码,所以它将是最简单的 //MyFirstClass.java class MyFirstClass{ ... MyExpandableListAdapter<FirstFilter> mAdapter = new MyExpandableListAdapter<FirstFilter>(); ..
我正在学习Java泛型,因为我想实现这一点: 我有两个类使用一个公共类,在这个公共类中我想创建一个泛型类的对象。这里有一段我的代码,所以它将是最简单的
//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;
}
}
//MyFirstClass.java
类MyFirstClass{
...
MyExpandableListAdapter mAdapter=新的MyExpandableListAdapter();
...
}
//MySecondClass.java
类MySecondClass{
...
MyExpandableListAdapter mAdapter=新的MyExpandableListAdapter();
...
}
//公共类MyExpandableListAdapter.java
公共类MyExpandableListAdapter扩展了BaseExpandableListAdapter,实现了Filterable{
专用E滤波器;
...
公共过滤器getFilter(){
if(filter==null)
filter=new();//这里我想创建一个对象,但在
回流过滤器;
}
}
有可能吗?我怎么能做到?
请帮帮我。非常感谢。由于泛型的实现方式,完全不可能像您在这里尝试的那样实例化泛型参数 通常的替代方法是使用某种工厂,即实现类似以下接口的类:
interface Factory<E> {
E newInstance();
}
接口工厂{
E newInstance();
}
这样,对于不同版本的
E
,您将有不同的工厂实现,编译器将检查您是否传入了一个正确的类型。您在运行时无法以您想要的方式访问E。你可以绕过这个,但有点混乱:
protected Class<E> filterClass;
@SuppressWarnings("unchecked")
public MyExpandableListAdapter() {
filterClass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
受保护类过滤器类;
@抑制警告(“未选中”)
公共MyExpandableListAdapter(){
filterClass=(类)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
拥有该类后,可以使用反射创建实例。看
你应该考虑如果增加的复杂性是值得的。非常感谢,我已经在你的帮助下解决了:祝你有美好的一天;非常感谢你。我已经用Andrzej Doyle发布的解决方案解决了这个问题。我想我也会尝试一下你的想法:)这是另一个很好的解决办法:)祝你今天愉快;)