基本概念
- 通常情况下集合中可以存放不同类型的对象,是因为将所有对象都看做Object类型放入的,因此从集合中取出元素时也是Object类型,为了表达该元素真实的数据类型,则需要强制类型转换,而强制类型转换可能会引发类型转换异常。
- 为了避免上述错误的发生,从Java5开始增加泛型机制,也就是在集合名称的右侧使用<数据类型>的方式来明确要求该集合中可以存放的元素类型,若放入其它类型的元素则编译报错。
- 泛型只在编译时期有效,在运行时期不区分是什么类型。
底层原理
- 泛型的本质就是参数化类型,也就是让数据类型作为参数传递,其中E相当于形式参数负责占位,而使用集合时<>中的数据类型相当于实际参数,用于给形式参数E进行初始化,从而使得集合中所有的E被实际参数替换,由于实际参数可以传递各种各样广泛的数据类型,因此得名为泛型。
自定义泛型接口
- 泛型接口和普通接口的区别就是后面添加了类型参数列表,可以有多个类型参数,如:<E, T, … >等。
- 比如java.lang包下的Comparable接口
public interface Comparable<T>{
public int compareTo(T o);
}
自定义泛型类
- 泛型类和普通类的区别就是类名后面添加了类型参数列表,可以有多个类型参数,如:<E, T, … >等。
- 实例化泛型类时应该指定具体的数据类型,并且是引用数据类型而不是基本数据类型。
- 父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型。
- 子类必须是“富二代”,子类除了指定或保留父类的泛型,还可以增加自己的泛型。
比如自定义链表时
public class LinkedList<E>{
public static class Node<E>{
E element;
Node<E> next;
public Node(E element,Node<E> next){
this.element=element;
this.next=next;
}
}
...
}
通配符的使用
- 有时候我们希望传入的类型在一个指定的范围内,此时就可以使用泛型通配符了。
- 如:之前传入的类型要求为Integer类型,但是后来业务需要Integer的父类Number类也可以传入。或者对传入二叉搜索树的泛型做出限制,要求其必须实现Comparable接口以满足在树内进行大小比较的要求。
public BinarySearchTree<E extends Comparable>{
...
}
- 泛型中有三种通配符形式:
- <?> 无限制通配符:表示我们可以传入任意类型的参数。
- <? extends E> 表示类型的上界是E,只能是E或者是E的子类。
- <? super E> 表示类型的下界是E,只能是E或者是E的父类。
本文深入探讨了Java泛型的基本概念,包括如何通过泛型限制集合中元素的类型,避免类型转换异常。Java5引入的泛型机制在编译时确保类型安全,运行时则不区分类型。泛型接口和泛型类的定义以及它们的实例化方式也在文中详述。此外,还介绍了泛型通配符的使用,包括无限制、上界和下界通配符,以适应不同的类型约束场景。
1103

被折叠的 条评论
为什么被折叠?



