在 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.
}
}
我正在尝试开发一个 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.
}
}