Java泛型主要是一种强制集合元素的静态类型的方法吗?

时间:2009-04-19 23:35:12

标签: java generics

private ArrayList<String> colors = new ArrayList<String>();

看看上面的例子,泛型的主要观点似乎是对集合强制执行类型。因此,我没有在程序员自行决定的情况下将一个“对象”数组转换为字符串,而是在ArrayList中对集合强制执行“String”类型。这对我来说是新的,但我只想检查一下我是否正确理解它。这种解释是否正确?

8 个答案:

答案 0 :(得分:8)

到目前为止,并非使用泛型,但它绝对是最明显的。

泛型可以(并且)在许多不同的地方使用,以确保静态类型安全,而不仅仅是集合。

我只想提一下,因为你会遇到泛型可能有用的地方,但如果你坚持使用泛型/收藏协会,那么你可能会忽略这一事实。

答案 1 :(得分:2)

是的,您的理解是正确的。该集合强类型为指定的任何类型,具有各种优点 - 包括不再运行时。

答案 2 :(得分:1)

是。保持类型安全并删除运行时强制转换是正确的答案。

答案 3 :(得分:1)

是的,基本上就是这样。在泛型之前,必须创建一个对象的ArrayList。这意味着可以将任何类型的Object添加到列表中 - 即使您只是想让ArrayList包含字符串。

所有仿制药都是添加类型安全。也就是说,现在JVM将确保列表中的任何对象都是String,并阻止您将非String对象添加到列表中。更好的是:这个检查是在编译时完成的。

答案 4 :(得分:0)

您可能需要查看Java site中的教程。它在引言中给出了很好的解释。

没有泛型:

List myIntList = new LinkedList(); // 1
myIntList.add(new Integer(0)); // 2
Integer x = (Integer) myIntList.iterator().next();  // 3

使用泛型

List<Integer> myIntList = new LinkedList<Integer>(); // 1'
myIntList.add(new Integer(0)); // 2'
Integer x = myIntList.iterator().next(); // 3'

我认为它类型安全,也节省了铸件。详细了解autoboxing

答案 5 :(得分:0)

您可以使用Collections实用程序类添加运行时检查。

http://java.sun.com/javase/6/docs/api/java/util/Collections.html#checkedCollection(java.util.Collection,%20java.lang.Class)

另见checkedSet,checkedList,checkedSortedSet,checkedMap,checkedSortedMap

答案 6 :(得分:0)

是的,你是对的。泛型为您的程序添加了编译时类型安全性,这意味着编译器可以检测您是否将错误类型的对象放入ArrayList

我想指出的一件事是,虽然它删除了可见的运行时转换并且使源代码不整齐,但JVM仍然在后台进行转换。

Generics在Java中实现的方式只是隐藏了转换并仍然产生非泛型字节码。 ArrayList<String>仍然是字节码中的ArrayList个对象。这样做的好处是它保持字节码与早期版本兼容。糟糕的是,这错过了一个巨大的优化机会。

答案 7 :(得分:0)

您可以在需要类型参数的任何地方使用通用,即在某些代码中应该相同但在或多或少未指定的类型。

例如,我的一个玩具项目是在Java中以通用方式编写计算机代数算法。这对于数学算法来说很有意思,但也可以通过压力测试来使用Java泛型。

在这个项目中,我有各种代数结构的接口,例如环和字段及其各自的元素,以及具体的类,例如对于整数或环上的多项式,其中环是类型参数。它有效,但在某些地方变得有些乏味。到目前为止,记录是一个变量前面的类型,它跨越两个完整的80个字符的行,用于测试多项式的不可约性的算法。主要的罪魁祸首是你不能给一个复杂的类型自己的名字。