2011-04-07 169 views
2

这是什么工作,没有类型?Java和泛型类

ArrayList l = new ArrayList(); 

难道它只是默认为object类型,如果你不指定类型,并投下一切反对呢?

在api中,它说ClassType(不会显示)小于大于符号的问号是什么意思。

+0

我认为它默认是键入'Object',Java中的每一个类都继承它。 – bdares 2011-04-07 07:58:36

+0

@bdares:不,ArrayList与ArrayList newacct 2011-04-07 09:23:13

回答

3

如果您不指定类型并且将所有对象都转换为对象,是否仅仅是默认的类型对象?

是的。这几乎是正确的。

未提供类型参数的通用类型(如ArrayList)称为原始类型。原始类型涵盖在官方线索Type Erasure

例如,Box<String>被转换成键入Box,这就是所谓的原料种类 - 原始类型是一个泛型类或接口的名称没有任何类型的参数。这意味着您无法找到泛型类在运行时使用的对象类型。

[...]

类型擦除的存在使得新的代码可能会继续与遗留代码的接口。 由于任何其他原因使用原​​始类型被认为是不好的编程习惯,应尽可能避免。

*)你可以把任何ObjectArrayList,但@newacct在评论中指出,ArrayList是不被认为一样ArrayList<Object>,因为ArrayList(和ArrayList<?> BTW)是两个超类型的ArrayList<WhatEver>,而ArrayList<Object>不是。

+0

在api中它意味着什么说有一个问号作为一个泛型? – rubixibuc 2011-04-07 08:03:03

+0

'ArrayList '是'ArrayList '的超类型,即它可以用作参数的类型,其中您不知道数组列表包含的内容。你可以阅读更多[这里](http://download.oracle.com/javase/tutorial/extra/generics/wildcards.html)。 – aioobe 2011-04-07 08:04:53

+0

当我使用Class.forName(“Class”)时,它应该返回一个具有指定泛型类的类Class??<(反过来它们不能让它们显示)。但是看起来evetyone只是使用class。这是一回事吗? – rubixibuc 2011-04-07 08:08:03

7

这就是所谓的原始类型。尽可能避免原始类型,因为它们会降低类型安全性。

基本上他们是为了向后兼容,所以当泛型被引入时,现有的代码仍然被编译。与以往一样,请参阅Java Generics FAQ了解更多详情。

注意,使用原始类型是一样使用与Object一个类型参数类型,作为原始类型有所有痕迹从他们有效的API中删除仿制药的 - 使用其他甚至泛型方法类型参数。这是什么使他们危险的一部分。

+0

+1:我从来没有想过用原始类型的通用方法进行处理......好提示 – 2011-04-07 08:04:13

1

是的。

这就是Java在泛型引入之前的工作方式。而实际上,这是还是它是如何工作的,引擎盖下。编译器执行基本的类型检查,然后执行类型擦除,所以您留下的字节码将与上述相同。

+0

+1指出泛型是在编译时执行的,而不是运行时 – CodeClimber 2011-04-07 08:39:20

0

您会在安装JDK的目录的根目录中找到一个zip文件。在那里,有一个src.zip。

我使用eclipse作为IDE。在那you can attach the source所以当你推CTRL + SHIFT + T并键入ArrayList时,你将能够看到它自己的来源;) 实际上它也是一个很好的方式来看看更多专家的ppl写源代码:)