通配符

通配符


上一篇博客主要说明了泛型的几种类型,而今天要说的通配符和泛型是息息相关的
在追加了泛型的定以后,我们解决了“两个没有关系的对象进行强转出现的异常”,但是又产生了新的情况:参数统一问题

class Message<T> {
    private T message;

    public T getMessage() {
        return message;
    }

    public void setMessage(T message) {
        this.message = message;
    }
}
public class Test{
    public static void main(String[] args) {
        Message<Integer> message = new Message();
        message.setMessage(99);
        fun(message);//出现错误,只能接收String
    }
    public static void fun(Message<String> temp){
        System.out.println(temp.getMessage());
    }
}

如上面代码,就出现了问题,泛型的类型设置的是Integer,而不是String
但是参数却是int型
  • 所以我们需要解决其问题:可以接收所有的泛型类型,但是又不能让用户随意修改;这种情况就需要使用通配符 ? 来处理

  • 可以接收任意类型

  • 只能取得类中数据,不能修改数据

public class Test{
    public static void main(String[] args) {
        Message<Integer> message = new Message();
        message.setMessage(99);
        fun(message);//出现错误,只能接收String
    }
    //此时使用通配符“?”描述的是它可以接收任意类型
    //但是由于不确定类型,所以无法修改
    public static void fun(Message<?> temp){
        //temp.setMessage(100);//无法修改
        System.out.println(temp.getMessage());
    }
}
  • ? extends 类 :设置泛型上限
  • 例如? extends Number,表示只能设置Number或其子类,例如:Integer,Double等
class Message<T extends Number> {//设置泛型上限
    private T message;

    public T getMessage() {
        return message;
    }

    public void setMessage(T message) {
        this.message = message;
    }
}
public class Test{
    public static void main(String[] args) {
        Message<Integer> message = new Message();
        message.setMessage(99);
        fun(message);//出现错误,只能接收String
    }
    //此时使用通配符“?”描述的是它可以接收任意类型
    //但是由于不确定类型,所以无法修改
    public static void fun(Message<? extends Number> temp){
        //temp.setMessage(100);//仍然无法修改
        System.out.println(temp.getMessage());
    }
}



用在类上: T extends 类:T必须为类或者类的子类
用在方法上:  ?  extends  类:只能接收类或者其子类的泛型类
只能取得类中属性值,不能修改值(发生父类到子类的向下转型。需要强转,由于具体子类不确定,因此无法转型)
  • ? super 类 :设置泛型下限
  • 例如? super 类,表示只能够设置String及其父类Object
class Message<T> {
    private T message;

    public T getMessage() {
        return message;
    }

    public void setMessage(T message) {
        this.message = message;
    }
}
public class Test{
    public static void main(String[] args) {
        Message<String> message = new Message();
        message.setMessage("hello world");
        fun(message);
    }
    //此时使用通配符“?”描述的是它可以接收任意类型
    //但是由于不确定类型,所以无法修改
    public static void fun(Message<? extends Number> temp){
        temp.setMessage("wonderful");//此时可以修改
        System.out.println(temp.getMessage());
    }
}


可以设置属性值(子类到父类是自动的向上转型)
  • 上限可以用在声明,不能修改;而下限只能用在方法参数,可以修改内容
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值