private ArrayList<String> colors = new ArrayList<String>();
看看上面的例子,泛型的主要观点似乎是对集合强制执行类型。因此,我没有在程序员自行决定的情况下将一个“对象”数组转换为字符串,而是在ArrayList中对集合强制执行“String”类型。这对我来说是新的,但我只想检查一下我是否正确理解它。这种解释是否正确?
答案 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实用程序类添加运行时检查。
另见checkedSet,checkedList,checkedSortedSet,checkedMap,checkedSortedMap
答案 6 :(得分:0)
是的,你是对的。泛型为您的程序添加了编译时类型安全性,这意味着编译器可以检测您是否将错误类型的对象放入ArrayList
。
我想指出的一件事是,虽然它删除了可见的运行时转换并且使源代码不整齐,但JVM仍然在后台进行转换。
Generics在Java中实现的方式只是隐藏了转换并仍然产生非泛型字节码。 ArrayList<String>
仍然是字节码中的ArrayList
个对象。这样做的好处是它保持字节码与早期版本兼容。糟糕的是,这错过了一个巨大的优化机会。
答案 7 :(得分:0)
您可以在需要类型参数的任何地方使用通用,即在某些代码中应该相同但在或多或少未指定的类型。
例如,我的一个玩具项目是在Java中以通用方式编写计算机代数算法。这对于数学算法来说很有意思,但也可以通过压力测试来使用Java泛型。
在这个项目中,我有各种代数结构的接口,例如环和字段及其各自的元素,以及具体的类,例如对于整数或环上的多项式,其中环是类型参数。它有效,但在某些地方变得有些乏味。到目前为止,记录是一个变量前面的类型,它跨越两个完整的80个字符的行,用于测试多项式的不可约性的算法。主要的罪魁祸首是你不能给一个复杂的类型自己的名字。