Java中的泛型机制与其使用

本文深入探讨了Java泛型的基本概念,包括如何通过泛型限制集合中元素的类型,避免类型转换异常。Java5引入的泛型机制在编译时确保类型安全,运行时则不区分类型。泛型接口和泛型类的定义以及它们的实例化方式也在文中详述。此外,还介绍了泛型通配符的使用,包括无限制、上界和下界通配符,以适应不同的类型约束场景。

基本概念

  • 通常情况下集合中可以存放不同类型的对象,是因为将所有对象都看做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>{
	...
}
  • 泛型中有三种通配符形式:
  1. <?> 无限制通配符:表示我们可以传入任意类型的参数。
  2. <? extends E> 表示类型的上界是E,只能是E或者是E的子类。
  3. <? super E> 表示类型的下界是E,只能是E或者是E的父类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值