概述
类型安全虽然有用,但有时会影响完全可以接受的结构。比如有时候要比较两个对象数组的平均值是否相同,而不考虑对象包含的数值的数据类型具体是什么。例如:一个int 数组的平均值为2,一个double 数组的平均值为2.0,那么平均值是相同的。解决此问题的途径是使用通配符(wildcard)参数,由?指定,表示未知类型。
有界通配符
可以使用与界定类型参数相同的方法界定通配符参数,对于操作类层次的的泛型来说很重要。比方说有个例子是输出维数数组的坐标值,有二维,三维,和四维
class TwoD {
int x, y;
TwoD(int a, int b) {
x = a;
y = b;
}
}
class ThreeD extends TwoD {
int z;
ThreeD(int a, int b, int c) {
super(a, b);
z = c;
}
}
class FourD extends ThreeD {
int t;
FourD(int a, int b, int c, int d) {
super(a, b, c);
t = d;
}
}
下面是一个泛型类,该类存储类一个数组;
public class Coords<T extends TwoD> {//有界类型 通过extends
T []coords ;
Coords(T []o){
coords=o;
}
该类指定一个由TwoD界定的类型参数
现在使用通配符定义一个输出方法:
static void showXY(Coords<?> o){//输出二维坐标,类型通配符由表示;
System.out.println("现在输出二维坐标的位置:");
for(int i=0;i<o.coords.length;i++)
System.out.println("坐标的X 和Y 值分别是:"+o.coords[i].x+"和"+o.coords[i].y);
System.out.println();
}
(因为是进行类之间的操作,所以使用通配符进行操作)
因为Coords指定类一个TwoD上界,所以showXY显示输出每一个TwoD类及其子类的数组。
如果要输出三维坐标怎么办呢?
Coords对象都只有两个坐标,无法输出X,Y,Z三个参数。
这是要使用有界的通配符参数。
现在定义一个方法,要求分别输出三维坐标值:
static void showXYZ(Coords<? extends ThreeD > a){
System.out.println("现在输出三维坐标的位置:");
for(int i=0;i<a.coords.length;i++)
System.out.println("坐标的X 和Y 和z值分别是:"+a.coords[i].x+"和"+a.coords[i].y+"和"+a.coords[i].z);
System.out.println();
因为这个界定,可以使用Coords<ThreeD>和Coords<FourD>对象调用showXY,但是不能调用TwoD类型对象,会导致编译储出错
static void showXYZT(Coords<? extends FourD > a){
System.out.println("现在输出四维坐标的位置:");
for(int i=0;i<a.coords.length;i++)
System.out.println("坐标的X 和Y 和z值分别是:"+a.coords[i].x+"和"+a.coords[i].y+"和"+a.coords[i].z+"和"+a.coords[i].t);
System.out.println();
} }
通过使用<? Extends superclass>的方法便可以指定上界的类型参数
使用<?extends super subclass>来指定下界的类型参数
当指定上界的类型参数时,?后表明可以匹配的上界,如果不匹配会编译出错;
当指定下界时,实际上是一个排除,只有指定下界的超类是可接受参数,不常用。
最后
以上就是狂野小蘑菇为你收集整理的关于通配符参数的全部内容,希望文章能够帮你解决关于通配符参数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复