为什么我不必宣布" new"在通用声明中?

时间:2017-02-18 22:22:37

标签: java

int soNum(Box *box, Box *sonbox, Particle *p){
// do stuff ...
}

不显示任何错误。我的问题是为什么这些显示错误?

&t->son->box

为什么我不必在ArrayList声明中声明(&t->son)->box

5 个答案:

答案 0 :(得分:1)

ArrayList<List<Integer>>是类型。它是整数列表的数组列表。通过调用其构造函数创建类型的新实例时,可以使用new关键字。这就是为什么你得到第一个和第三个片段的错误 - 当你只需要调用主类型的构造函数时,你试图调用其他构造函数。

第二个错误是因为内部类型的实例化比声明的类型更具体/限制,因此它不符合合同并且可能因期望合同得到满足的调用者而中断。您仍然可以将内部列表设置为ArrayList,因为它继承自List,但您在实例化列表时会这样做。

ArrayList<List<Integer>> test = new ArrayList<List<Integer>>();
test.add(new ArrayList<Integer>());

答案 1 :(得分:0)

示例1

在尖括号内声明泛型 types ,而不是构造对象的实例。

为此:

error: illegal start of type 
            List<List<Integer> >a =new ArrayList<new List<Integer>() >();
                                                 ^

此错误表示您无法在通用类型中使用new关键字。

示例3

您的第三个示例显示了类似的错误:

error: illegal start of type
            List<List<Integer> >a =new ArrayList<new ArrayList<Integer>() >();
                                                 ^

泛型类型表示一个类,而不是实例。

示例2

对于第二个示例,错误消息告诉您泛型类型必须相同。您不能将这样的继承应用于泛型类型:

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 overviewthe 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的元素类型。