2013-05-10 54 views
1

,所以我有这四个类/接口:添加一个通用的ArrayList到一个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的实例的列表框中的列表。我不确定为什么这会给我一个错误。

public ArrayList<ArrayList<Box>> variable = new ArrayList<ArrayList<Box>>(); 
    this.variable.add(new ArrayList<Box<ThisItem>>(5)); 
+2

确保包括在问题*确切*错误消息。 – user2246674 2013-05-10 00:17:45

+1

这仅仅是我还是有时候人们只是泛泛而谈呢? – 2013-05-10 00:22:40

回答

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

这摆脱了错误,但是我需要实例化ArrayList,然后在一个新类的构造函数中添加ThisItem或OtherItem ArrayList,以便我可以将它们各自类型的项添加到它。 – TheGandhi 2013-05-10 00:38:03

1

ThisItem原料类型的SomeClass;它与将其声明为implements SomeClass<Object>大致相同,因此编译器无法验证以这种方式使用它是否合适。

相反,声明为类型:

public class ThisItem implements SomeClass<SomeComparableClass> {...} 
+0

我不太清楚的含义。你能解释一下吗? – TheGandhi 2013-05-10 00:49:54

+0

SomeClass被定义为'public interface SomeClass >',这意味着要实现它是一个'typed'接口(不是* raw *类型),您必须为泛型参数提供一个类型,并且该类型为以Comparable类型为界,所以SomethingComparable就是这种类型。我将改变它的名字然后 - 编辑 – Bohemian 2013-05-10 02:44:29

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

出现错误,“无法将ArrayList 转换为ArrayList >” – TheGandhi 2013-05-10 00:44:04

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

问题是我不知道该框是否需要键入ThisItem或OtherItem,直到我进入需要arraylist的构造函数。那么有没有办法在构造函数w.o中创建一个实例变量来定义它之外的变量? – TheGandhi 2013-05-10 00:48:48

+0

@TheGandhi这个错误的目的是阻止你在我的答案中描述的情况,但是如果你确定你不会将不正确的对象添加到不正确的列表中,你可以通过将你的新列表转换为原始类型来摆脱这个错误'variable.add((ArrayList)new ArrayList >(5));'。但是这种编码方式对于类型安全是危险的,所以除非你没有其他选择,否则不要使用它(大多数情况下,人们可以重新设计他们的项目以避免这种情况)。 – Pshemo 2013-05-10 01:28:29

0

这应该工作:

public ArrayList<ArrayList<? extends Box>> variable = new ArrayList<ArrayList<? extends Box>>(); 
相关问题