在 class 中实例化泛型类型:V extends List

Instantiating Generic Type in class: V extends List

我正在尝试开发一个 class 来处理扩展 java.util.List 的对象,例如 ArrayList。下面是我认为应该编译的示例(假设有必要的导入语句):

public class MyClass<V extends List> {

    V myList = new ArrayList();

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

虽然 "myinstace" 没有问题,但编译器在尝试实例化 "myList." 时失败:

MyClass.java:[17,16] incompatible types: java.util.ArrayList cannot be converted to V

据我了解泛型,声明:

<V extends List>

意味着无论 "V" 是什么类型,它都必须是 "List." 的子 class 因此,为什么我不能像上面那样实例化,有没有正确的方法来实例化一个class?

中 "V" 类型的对象

此外,return "V" 类型的对象如何在 class 的方法中?

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();

}

我正在尝试开发一个子class,PolyPatternElement,它本身可以包含许多"data" 和"width" 项。我认为下面的代码可以完成这个...

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 的任何实现,这是我的意图。

尝试(未测试):

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

... implies that whatever type "V" is, it must be a subclass of "List."

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

public class MyClass<V extends List> {

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

}

您必须提供 class 或带有构造函数的对象:

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.
    }

}