泛型(一):简介与类型通配符

1. 简介:

Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。

Java的参数化类型被称为泛型。所谓泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类型参数,也可称为类型实参)。

不管为泛型的类型形参传入哪一种类型实参,对于Java来说,它们依然被当成同一个类来处理。

2.类型通配符:

List<String>对象不能被当成List<Object>对象使用,也就是说,List<String>类并不是List<Object>类的子类。

Java泛型的设计原则是,只要代码在编译时没有出现警告,就不会遇到运行时ClassCastException异常。

    2.1.使用类型通配符:

为了表示各种泛型List的父类,我们需要使用类型通配符,类型通配符是一个问号,将一个问号作为类型实参传给List集合,写作List<?>(意思是未知元素类型的List)。问号可以匹配任何类型。

但这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素加入到其中。例如如下代码将会引起编译错误:

List<?> c = new ArrayList<String>();
//下面程序引起编译错误
c.add(new Object());

因为我们不知道上面程序中c集合里元素的类型,所以不能向其中添加对象。根据List<E>接口定义的代码可以发现:add方法有类型参数E作为集合的元素类型,所以传给add的参数必须是E类的对象或其子类的对象。但因为在该例中不知道E是什么类型,所以程序无法将任何对象丢进该集合。唯一的例外是null,它是所有引用类型的实例。

    2.2.设定类型通配符的上限:

当直接使用List<?>这种形式时,表明这个List集合可以是任何泛型List的父类。

但还有一种特殊的情形,我们不想使这个List<?>是任何泛型List的父类,只想表示它是某一类泛型List的父类。所以我们需要一种泛型表示方法,它可以表示所有Shape泛型List的父类。为了满足这种需求,Java泛型提供了被限制的泛型通配符。被限制的泛型通配符表示如下:

//它表示所有Shape泛型List的父类
List<? extends Shape>

此时我们可以将List<Circle>对象当成List<? extends Shape>使用,只要List后尖括号里的类型是Shape的子类型即可。这种情况下,我们称Shape为类型通配符的上限。

因为不知道这个受限制的通配符的具体类型,所以不能把Shape对象或其子类对象加入这个泛型集合中:

public void addRectangle(List<? extends Shape> shapes){
	//下面代码将引起编译错误
	shapes.add(0,new Rectangle());
}

2.3.设定类型形参的上限:

Java泛型不仅允许在使用通配符形参时设定上限,而且可以在定义类型形参时设定上限,用于表示传给该类型形参的实际类型要么是该上限类型,要么是该上限类型的子类。

public class Apple<T extends Number>{

	private T col;

	public static void main(String[] args){
		Apple<Integer> ai = new Apple<Integer>();
		Apple<Double> ad = new Apple<Double>();
		//下面代码将引起编译错误,因为String不是Number的子类型
		Apple<String> as = new Apple<String>();
	}
}

 

转载于:https://my.oschina.net/u/2914561/blog/834319

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值