本章目标
掌握通配符“?”的使用
掌握受限泛型的设置
掌握泛型与子类继承的限制
匹配任意类型的通配符
在开发中对象的引用传递是最常见的,但是如果在泛型类的操作中,在进行引用传递的时候泛型类型必须匹配才可以传递,否则是无法传递的。
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>。