所以我有这四个类/接口:
public class Box <S extends SomeClass> implements Comparable <Box<S>> {...}
public interface SomeClass <T extends Comparable<T>> {...}
public class ThisItem implements SomeClass {...}
public class OtherItem implements SomeClass {...}
我正在尝试创建一个包含ThisItem实例列表的Box列表。我不确定为什么这会给我一个错误。
public ArrayList<ArrayList<Box>> variable = new ArrayList<ArrayList<Box>>();
this.variable.add(new ArrayList<Box<ThisItem>>(5));
答案 0 :(得分:5)
Box
是一个泛型类,因此当它与Box
一样使用时,它是一个原始类型,它与Box<ThisItem>
不同,后者指定了一个类型参数。这类似于ArrayList<Box>
,其中Box
是类型参数。
改变这个:
public ArrayList<ArrayList<Box>> variable = new ArrayList<ArrayList<Box>>();
要:
public ArrayList<ArrayList<Box<ThisItem>>> variable = new ArrayList<ArrayList<Box<ThisItem>>>();
答案 1 :(得分:1)
ThisItem
是原始类型的SomeClass
;它与将其声明为implements SomeClass<Object>
大致相同,因此编译器无法验证是否适合以这种方式使用。
而是将其声明为键入:
public class ThisItem implements SomeClass<SomeComparableClass> {...}
答案 2 :(得分:1)
您如何看待variable
存储ArrayList<Box<ThisItem>>
列表是否安全?
如果Java允许这样做,那么从variable
获取该列表时,它将被设置为ArrayList<Box>
。由于返回的列表允许您将任何类型的Box
对象添加到最初ArrayList<Box<ThisItem>>
仅存储Box<ThisItem>
对象的variable
列表中。
要摆脱这个问题,您应该将public ArrayList<ArrayList<Box<ThisItem>>> variable
= new ArrayList<ArrayList<Box<ThisItem>>>();
声明为
{{1}}
答案 3 :(得分:0)
这个怎么样..
public ArrayList<ArrayList<Box>> variable = new ArrayList<ArrayList<Box>>();
this.variable.add(new ArrayList<Box<ThisItem>>(5));
为...
public ArrayList<ArrayList<Box>> variable = new ArrayList<ArrayList<Box>>();
ArrayList<Box<ThisItem>> tempInstance = new ArrayList<>();
tempInstance.add(new Box<ThisItem>()); //add new Boxes manually as you wish
this.variable.add(tempInstance);
答案 4 :(得分:0)
这应该有效:
public ArrayList<ArrayList<? extends Box>> variable = new ArrayList<ArrayList<? extends Box>>();