Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型用法_Java_Generics - Fatal编程技术网

Java泛型用法

Java泛型用法,java,generics,Java,Generics,请问,为什么我要在左侧(变量声明)和右侧(对象赋值)提供泛型类? 我可以从技术上向左或向右跳过它(请参见alist2或alist2),与aList1相比,alist2和aList3有什么缺点 ArrayList<String> aList1 = new ArrayList<String>(); ArrayList<String> aList2 = new ArrayList(); ArrayList aList3 = new ArrayList

请问,为什么我要在左侧(变量声明)和右侧(对象赋值)提供泛型类? 我可以从技术上向左或向右跳过它(请参见alist2或alist2),与aList1相比,alist2和aList3有什么缺点

ArrayList<String> aList1 = new ArrayList<String>();
ArrayList<String> aList2 = new ArrayList();
ArrayList         aList3 = new ArrayList<String>();
ArrayList aList1=new ArrayList();
ArrayList aList2=新的ArrayList();
ArrayList aList3=新的ArrayList();
额外的问题,刚刚出现在我的脑海中,它被编译了,但这对aList4和aList5意味着什么

ArrayList<String> aList4 = new ArrayList<>();
ArrayList<?>      aList5 = new ArrayList<String>();
ArrayList aList4=新的ArrayList();
ArrayList aList5=新的ArrayList();
先谢谢你

亲切问候,,
Hermann

第一个列表是Java 6及更早版本声明的标准版本,以避免从新的arraylist中获取原始类型。从Java7开始,您可以同样安全地使用第二个列表

我不确定第三个列表在Java7中是否安全,但我认为它要么以对象的形式存储所有内容(原始类型问题),要么甚至可能无法编译

第四个列表基本上等同于第二个列表,第五个列表相当于第三个列表


编辑:刚刚测试过,第三个列表确实返回原始类型,所以我建议不要使用它。我还没有注意到第二个列表在ArrayList的
new
声明中缺少了一个菱形运算符(您应该有)。

ArrayList
是一个原始类型。Java规范提供了以下关于它们的信息:

只允许使用原始类型作为对遗留代码兼容性的让步。强烈反对在Java编程语言中引入泛型后编写的代码中使用原始类型。Java编程语言的未来版本可能会禁止使用原始类型


ArrayList
是一种通配符类型,特别是所有ArrayList的超级类型,无论其类型参数如何。由于我们不知道列表中元素的类型,因此使用它可以比使用普通ArrayList做的更少。例如,除了
null
之外,您不能向其中添加任何内容,并且您从列表中获取的每一个内容都只知道是
对象


ArrayList
ArrayList
的简写符号,其中
X
替换为赋值左侧的类型参数。也就是说,
ArrayList list=new ArrayList()
完全等同于
ArrayList list=new ArrayList()
。菱形运算符仅存在于Java 7及更高版本中,并且只能在编译器足够聪明以推断类型的地方使用,但在这些情况下,它通常是使用泛型的最正确、最简洁的方法。

您应该使用最适合实现的
泛型
类。也就是说,如果您只关心项目集合,您应该使用
集合
,如果您需要保留顺序,您应该使用界面
列表
。原因是您应该:

程序到接口而不是实现

为什么这样好?因为它使改变实现变得更容易。假设您希望将来从ArrayList更改为LinkedList。然后,只需将对
newarraylist
的调用更改为
newlinkedlist
。对于您自己的代码也是如此,请尝试始终使用不只是dataobject的任何类的接口。这将使您考虑对象之间的接口,而不是实现,这样一来,您总是可以先编写一些糟糕的代码,然后在发现需要时对实现进行优化,而不会破坏代码

那么,为什么不根据示例推断类型是不好的呢? 主要是因为程序不知道列表包含什么类型,这意味着要么你必须通过知道类型或者通过计算类型将这些对象转换为它们的类型


至于为什么aList2不好,我只参考Java 7中的这个

,您可以安全地使用第二个列表,就像您所说的
aList4
,而不是
aList2
。啊,是的,我忽略了那里缺少菱形操作符,请稍等。请注意,第二个列表
aList2
编译时带有一条自Java 5以来的警告。@Rogue
list strs=new ArrayList();列表原始=STR;原始添加(1234)除非我大错特错,否则3和5不相等。3是原始的,5决不是一个完整的答案,但对于您设计的类的泛型,aList3不会有很大帮助。假设你在aList3上有一个
ArrayList
,你必须将其中的任何项目投射到汽车上。反之亦然,如果右侧没有泛型,您将添加对象作为对象,这在技术上是有效的,但您不希望将
Car
类型的对象添加到用于存储
Person
类型对象的ArrayList中