通配符

本章目标
掌握通配符“?”的使用
掌握受限泛型的设置
掌握泛型与子类继承的限制

 

匹配任意类型的通配符
在开发中对象的引用传递是最常见的,但是如果在泛型类的操作中,在进行引用传递的时候泛型类型必须匹配才可以传递,否则是无法传递的。

public class GenericDemo12 {
	public static void main(String[] args) {
		Info<String> i = new Info<String>();//指定 String 为泛型类型
		i.setVar("chaoyi");//设置字符串
		fun(i);//错误,无法传递
	}
	public static void fun(Info<Object> temp){//此处可以接收 Object 泛型类型的 Info 对象
		System.out.println("内容:"+temp);
	}
/* 结果:
 * 	The method fun(Info<Object>) in the type GenericDemo12 is not applicable for the arguments (Info<String>)
 * 	at J031002.GenericDemo12.main(GenericDemo12.java:7)
 * */
}

 

使用通配符“?”
public class GenericDemo14 {
	public static void main(String[] args) {
		Info<String> i = new Info<String>();//指定 String 为泛型类型
		i.setVar("chaoyi");//设置字符串
		fun(i);//错误,无法传递
	}
	public static void fun(Info<?> temp){//此处可以接收 Info 对象
		System.out.println("内容:"+temp);
	}
/* 结果:
 * 内容:chaoyi
 * */
}

 

以上程序在fun()方法中使用“Info<?>”的代码形式,表示可以使用任意的泛型类型对象,这样做的话fun()方法定义的就比较合理了,但是在使用以上语法的时候也有一个注意点,即:如果使用“?”接收泛型对象的时候,则不能设置被泛型指定的内容

受限泛型
在引用传递中,泛型操作中也可以设置一个泛型对象的范围上限和范围下限。范围上限使用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类,而范围下限使用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object类。
——设置上限:
————声明对象:类名称<? extends 类> 对象名称
————定义类:[访问权限] 类名称<泛型标识 extends 类>{}
——设置下限:
————声明对象:类名称<? super 类> 对象名称
————定义类:[访问权限] 类名称<泛型标识 extends 类>{}

 

泛型的上限

public class GenericDemo17 {
	public static void main(String[] args) {
		Info<Integer> i1 = new Info<Integer>();//声明 Integer 的泛型对象
		Info<Float> i2 = new Info<Float>();//声明 Float 的泛型对象
		i1.setVar(30);//设置整数,自动装箱
		i2.setVar(30.1f);//设置小数,自动装箱
		fun(i1);//是数字,可以传递
		fun(i2);//是数字,可以传递
	}
	//接收 Info 对象,范围上限设置为 Number, 所以只能接收数字类型
	public static void fun(Info<? extends Number> temp){
		System.out.print(temp+"、");
	}
/* 结果:
 * 30、30.1、
 * */
}

 

泛型的下限
public class GenericDemo21 {
	public static void main(String[] args) {
		Info<Object> i1 = new Info<Object>();//满足下限范围
		Info<String> i2 = new Info<String>();//满足下限范围
		i1.setVar(new Object());//设置 Object 对象
		i2.setVar("chaoyi");//设置字符串
		fun(i1);
		fun(i2);
	}
	//只能接收 String 或Object 类型的泛型
	public static void fun(Info<? super String> temp){
		System.out.println("内容:"+temp);
	}
/* 结果:
 * 内容:java.lang.Object@6bbc4459
 * 内容:chaoyi
 * */
}

 

解释:泛型与子类继承的限制
一个类的子类可以通过对象多态性,为其父类实例化,但是在泛型操作中,子类的泛型类型是无法使用父类的泛型类型接收,例如:Info <String>不能使用Info<Object>。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值