Java和通用类

时间:2011-04-07 07:57:29

标签: java generics

没有类型,这有什么作用?

ArrayList l = new ArrayList();

如果你没有指定类型,并且将所有内容都转换为对象,它是否默认为类型对象?

当api表示ClassType(不会显示)小于大于符号的问号时,它意味着什么。

4 个答案:

答案 0 :(得分:7)

这称为原始类型。尽可能避免使用原始类型,因为它们会降低类型安全性。

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

请注意,使用原始类型与使用类型参数为Object的类型相同,因为原始类型具有所有痕迹的泛型从有效的API中删除 - 甚至使用其他类型参数的通用方法。这是使它们变得危险的一部分。

答案 1 :(得分:3)

  

如果您没有指定类型,并且将所有内容转换为对象,它是否默认为类型对象?

是。那几乎是对的。

未提供类型参数的泛型类型(例如ArrayList)称为原始类型。原始类型包含在官方路径Type Erasure中:

  

例如,Box<String>被转换为类型Box,它被称为原始类型 - 原始类型是没有任何类型参数的泛型类或接口名称。这意味着您无法找到泛型类在运行时使用的Object类型。

     

[...]

     

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

*)您可以将Object添加到ArrayList,但正如@newacct在评论中指出的那样,ArrayList不会被视为 ArrayList<Object>,因为ArrayList(和ArrayList<?> btw)都是ArrayList<WhatEver>的超类型,而ArrayList<Object>则不是。{/ p>

答案 2 :(得分:1)

这是Java在引入泛型之前的工作方式。事实上,这是仍然它是如何工作的。编译器执行基本类型检查,然后执行类型擦除,因此您留下的字节码将与上面的字节码相同。

答案 3 :(得分:0)

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

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