【问题标题】:Create an Object using a Generics type Java [duplicate]使用泛型类型 Java 创建对象 [重复]
【发布时间】:2012-03-13 18:29:54
【问题描述】:

可能重复:
Instantiating a generic class in 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;
    }
}

有可能吗?我怎么能做到? 请帮我。非常感谢。

【问题讨论】:

    标签: java generics


    【解决方案1】:

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

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

    interface Factory<E> {  
        E newInstance();
    }
    

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

    【讨论】:

    • 非常感谢,在您的帮助下我已经解决了:)祝您有美好的一天;)
    【解决方案2】:

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

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

    拥有类后,您可以使用反射来创建实例。见this tutorial for more information

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

    【讨论】:

    • 非常感谢。我已经使用 Andrzej Doyle 发布的解决方案解决了。我想我也会尝试你的好奇心 :) 这是另一个很好的解决方案 :) 祝你有美好的一天 ;)
    猜你喜欢
    • 1970-01-01
    • 2014-04-04
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多