0%

Java-泛型

On-Java-8 : 你可以了解 Java 泛型的局限是什么,以及为什么会有这些局限。最终的目标是明确 Java 泛型的边界,让你成为一个程序高手。

只有知道了某个技术不能做什么,你才能更好地做到所能做的(部分原因是,不必浪费时间在死胡同里)。

java泛型设计背景

在早期的Java版本中,集合类(如ArrayList、LinkedList等)中的元素类型是Object类型,这意味着集合类可以容纳任何类型的对象,但是在使用集合类时需要进行频繁的类型转换,这可能导致程序在运行时出现类型转换错误。同时,由于编译器无法检查程序员的类型安全性错误,这些错误可能会在程序运行时才被发现。

为了解决这些问题,Java SE 5引入了泛型。Java泛型通过在定义集合类时使用类型参数来指定集合中元素的类型,从而避免了在使用集合类时进行频繁的类型转换。在编译时,编译器会检查集合中添加或获取元素的类型是否与类型参数所指定的类型相同,从而提高了程序的类型安全性。

当使用集合类(如ArrayList、LinkedList等)时,我们可以使用泛型来指定集合中元素的类型,例如:

1
2
3
4
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");

在上面的代码中,我们使用了List来指定集合中元素的类型为String类型。这样,在编译时编译器会检查集合中添加的元素是否为String类型,从而提高程序的类型安全性。同时,我们不需要在使用集合中的元素时进行类型转换,这可以使代码更加简洁易读。

另外一个例子是在使用Map集合时,我们可以使用泛型来指定键值对的类型,例如:

1
2
3
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("apple", 1);
map.put("banana", 2);

在上面的代码中,我们使用了Map<String, Integer>来指定键值对的类型为String和Integer类型。这样,在编译时编译器会检查键和值的类型是否正确,从而提高程序的类型安全性。同时,我们在使用Map中的键或值时也不需要进行类型转换,这可以使代码更加简洁易读。

如果我们错误地将一个非String类型的对象添加到集合中,编译器会在编译时报告错误。

总结

Java泛型的设计背景可以概括为以下几点:

提高程序的类型安全性
减少类型转换的次数
提高程序的可读性和可维护性
允许程序员编写更加通用的代码
在集合类等常用API中使用泛型可以提高API的可用性和可靠性.