在类中实例化Generic Type:V扩展List

时间:2016-08-25 10:50:01

标签: java generics arraylist extends

我正在尝试开发一个与扩展java.util.List的对象一起工作的类,例如ArrayList。下面是我认为应该编译的示例(假设必要的import语句):

public class MyClass<V extends List> {

    V myList = new ArrayList();

    MyClass<ArrayList> myinstance = new MyClass<>();
}

虽然“myinstace”没有问题,但是在尝试实例化“myList”时编译器失败了:

  

MyClass.java:[17,16]不兼容的类型:java.util.ArrayList不能   转换为V

据我了解泛型,声明:

<V extends List>

暗示无论“V”是什么类型,它都必须是“List”的子类。因此,为什么我不能像上面那样实例化,是否有任何正确的方法来实例化类中“V”类型的对象?

此外,如何在类中的方法中返回类型为“V”的对象?

public V getSomeData(){
    // How do we create our object of type "V"?
}

背景

我有一个接口,PatternElement:

public interface PatternElement<D,W> {

    /**
     * The data that this element contains or signifies.
     * @return 
     */
    public D getData();

    /**
     * The width of this pattern element within a pattern.
     * @return 
     */
    public W getWidth();

}

我正在尝试开发一个子类PolyPatternElement,它本身可以包含许多“数据”和“宽度”项。我认为以下代码可以实现这一目标......

public class PolyPatternElement<V extends List, W extends List> implements PatternElement<V,W>{


    @Override
    public V getData() {
        ArrayList data = new ArrayList();
        return data;
    }

    @Override
    public W getWidth() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

} 

不幸的是,“getData”无法编译。因此,我缩小了问题并提出了原始问题。在反馈之后,我认为更好的PolyPatternElement定义是:

public class PolyPatternElement<V,W> implements PatternElement<List,List>{


    @Override
    public List getData() {
        ArrayList data = new ArrayList();
        return data;
    }

    @Override
    public List getWidth() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

这允许声明一个PolyPatternElement对象,其类型是List的任何实现,这是我的意图。

2 个答案:

答案 0 :(得分:0)

尝试(未经测试):

public class PolyPatternElement<V, W> implements PatternElement<List<V>, List<W>>

答案 1 :(得分:0)

  

...暗示无论什么类型&#34; V&#34;是的,它必须是&#34; List。&#34;

的子类

在泛型类中,您不能简单地实例化泛型参数类的对象。

public class MyClass<V extends List> {

    V myList = new ArrayList();  // <-- What if 'V' is 'LinkedList'?

}

您必须使用构造函数提供类或对象:

public class MyClass<V extends List> {

    private final V myList;

    public MyClass(V theList) {
        this.myList = theList;
    }

    public MyClass(Class<V> listType) {
        this.myList = listType.newInstance(); // works only if 'listType' has default constructor.
    }

}