将通用arraylist添加到arraylist

时间:2013-05-10 00:16:14

标签: java generics arraylist

所以我有这四个类/接口:

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

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