我正在尝试开发一个与扩展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的任何实现,这是我的意图。
答案 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.
}
}