关于通配符参数

类型安全虽然有用,但有时会影响完全可以接受的结构。比如有时候要比较两个对象数组的平均值是否相同,而不考虑对象包含的数值的数据类型具体是什么。例如:一个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("坐标的值分别是:"+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("坐标的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("坐标的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>来指定下界的类型参数

当指定上界的类型参数时,?后表明可以匹配的上界,如果不匹配会编译出错;

当指定下界时,实际上是一个排除,只有指定下界的超类是可接受参数,不常用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值