泛型小助手-通配符(?)

泛型通配符

虽然通配符给我们解决了一系列强制转换所带来的安全隐患,但是从另外一个角度来讲,泛型也带来了一些新的问题:引用传递处理

范例:观察问题的产生

public class Message<T> {

    private T content;

    public T getContent() {
        return content;
    }

    public void setContent(T content) {
        this.content = content;
    }
}
public class Demo {

    public static void main(String[] args) {
        Message<Integer> msgA = new Message<Integer>() ;
        msgA.setContent(110) ;
        fun(msgA) ;

    }
    public static void fun(Message<Integer> message){
        System.out.println(message.getContent());
    }
}

但是这个时候问题也就出现了,而问题的关键在于fun()方法上,如果真的去使用泛型,不可能只是一种类型,也就是说fun()方法应该可以接收任意种泛型类型的Message对象。但是这个时候它只能够接收“Message”类型,这种情况下可能首先会想到的方法是,不设置泛型,只进行传递message对象即可。

来看范例:

public class Demo {
    public static void main(String args[]) {
        Message<Integer> msgA = new Message<Integer>() ;
        Message<String> msgB = new Message<String>() ;
        msgA.setContent(110) ;   
        fun(msgA) ;    //引用传递
        msgB.setContent(“www.raycloud.com”) ;   
        fun(msgB) ;   
    }  
    public static void fun(Message mes) {
        System.out.println(mes.getContent()) ;
    }   
// 执行结果 110 www.raycloud.com
}
public static void fun(Message mes) {
    temp.setContent(1.1) ;
    System.out.println(mes.getContent()) ;
}    //执行结果:1.1   1.1

这个时候发现如果不设置泛型,那么在方法之中就有可能对数据进行修改,所以此时我们需要找一种方案,可以接收所有的泛型类型,并且不能够修改里面的数据(允许获取),那么就需要通过通配符“?”来解决。

范例:使用通配符

class Message <T> {    
    private T content ;
    public void setContent(T content) {
        this.content = content ;
    }   
    public T getContent() {
        return this.content ; 
    }
}
public class JavaDemo {
    public static void main(String args[]) {
        Message<Integer> msgA = new Message<Integer>() ;
        Message<String> msgB = new Message<String>() ;
        msgA.setContent(110) ;   
        fun(msgA) ;    //引用传递
        msgB.setContent(“www.raycloud.com”) ;   
        fun(msgB) ;   
    }  
    public static void fun(Message<?> mes) {
        System.out.println(mes.getContent()) ;
    }    
//执行结果:
//110
//www.raycloud.com
}

此时在fun()方法里面由于采用了Message结合通配符的处理所以可以接收所有的类型,并且不允许修改,只允许获取数据。

 

在“?”这个通配符的基础之上实际上还提供有两类小的通配符:

  • ?extends 类:设置泛型的上限:

    • 例如:定义“?extends Number”:表示该泛型类型只允许设置Number或Number的子类;
  • ?super 类:设置泛型的下限:

    • 例如:定义“?super String”:只能够使用String或其父类;

对于通配符而言,是一个重要的概念,并且要求一定要理解此概念的定义,在日后的学习Java系统类库的时候一定会见到大量的通配符使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值