使用泛型类型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发布的解决方案解决了这个问题。我想我也会尝试一下你的想法:)这是另一个很好的解决办法:)祝你今天愉快;)