int soNum(Box *box, Box *sonbox, Particle *p){
// do stuff ...
}
不显示任何错误。我的问题是为什么这些显示错误?
&t->son->box
为什么我不必在ArrayList声明中声明(&t->son)->box
?
答案 0 :(得分:1)
ArrayList<List<Integer>>
是类型。它是整数列表的数组列表。通过调用其构造函数创建类型的新实例时,可以使用new
关键字。这就是为什么你得到第一个和第三个片段的错误 - 当你只需要调用主类型的构造函数时,你试图调用其他构造函数。
第二个错误是因为内部类型的实例化比声明的类型更具体/限制,因此它不符合合同并且可能因期望合同得到满足的调用者而中断。您仍然可以将内部列表设置为ArrayList
,因为它继承自List
,但您在实例化列表时会这样做。
ArrayList<List<Integer>> test = new ArrayList<List<Integer>>();
test.add(new ArrayList<Integer>());
答案 1 :(得分:0)
在尖括号内声明泛型 types ,而不是构造对象的实例。
为此:
error: illegal start of type
List<List<Integer> >a =new ArrayList<new List<Integer>() >();
^
此错误表示您无法在通用类型中使用new
关键字。
您的第三个示例显示了类似的错误:
error: illegal start of type
List<List<Integer> >a =new ArrayList<new ArrayList<Integer>() >();
^
泛型类型表示一个类,而不是实例。
对于第二个示例,错误消息告诉您泛型类型必须相同。您不能将这样的继承应用于泛型类型:
error: incompatible types: ArrayList<ArrayList<Integer>> cannot be converted to List<List<Integer>>
List<List<Integer> >a =new ArrayList<ArrayList<Integer> >();
^
要声明List
子类型的通用列表,可以使用通配符表达式? extends List
作为泛型类型:
List<? extends List<Integer>> a = new ArrayList<ArrayList<Integer>>();
有关泛型的更多信息oracle has a good overview和the Java Tutorial有一个很好的指南。
答案 2 :(得分:0)
List<List<Integer> >a =new ArrayList<new List<Integer>() >();
这是错误的,因为您不需要将括号放在内部声明中,因为内部列表的内存分配将在以后发生。
List<List<Integer> >a =new ArrayList<ArrayList<Integer> >();
这是错误的,因为此行只初始化外部List
。因此,您可以将外部ArrayList
类型转换为列表,因为List
是其超类。但是,由于您尚未初始化内部列表,因此它仍应保持为List
。
你可以这样考虑。 List
内部集合的每个元素实际上可以是任何类型的扩展List
而不一定是ArrayList
的类。您需要在需要时单独初始化它们。
List<List<Integer> >a =new ArrayList<new ArrayList<Integer>() >();
这是上述两个错误的组合。
答案 3 :(得分:0)
java中的尖括号<>
表示generics
。角括号内的内容是类型(类或接口),不是对象。在类型前面使用new
运算符时,它表示该类型的对象。这就是在角括号内使用new
运算符时出错的原因。
答案 4 :(得分:-2)
List<Integer>
和ArrayList<Integer>
是类。
new ArrayList<Integer>()
是对象。
&LT;&GT; - 它不是ArrayList声明,你指定ArrayList的元素类型。