数据结构(泛型下)

 日升时奋斗,日落时自省

目录

二、泛型通配符

1.通配符的上限

2.通配符的下限

三、包装类

 1.包装类的自动转化

2.拆包


二、泛型通配符

通配符不予上界相同,通配符有上限有下限

通配符上限会使用:extends

通配符下限会使用:super

1.通配符的上限

 通配符的上限看以上图解,上限如同父类,在我们想要调用的时候只能我们知道他的子类有什么,所以最大调用只能调用到自己的本身

用代码解释:

class Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class Banana extends Fruit {
}
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<Apple> message=new Message<>();
        message.setMessage(new Apple());
        fun(message);
        Message<Banana> message1=new Message<>();
        message1.setMessage(new Banana());
        fun(message1);
        Message<Fruit> message2=new Message<>();
        message2.setMessage(new Fruit());
        fun(message2);
    }

    public static void fun(Message<? extends Fruit> tmp){
        tmp.getMessage();  //能够串
    }
}

当前代码举了三个图中的三个例子,本身和子类都是没有问题的,这里通配符也只能接受当前这三个类

当前他们存在依附关系 

如果我们尝试用Fruit的父类Food可以看一下结果

 报错了,就说明上限对于传参的要求和接收,在限定类本身与子类

那是否能给我们当前含有通配符的方法中放东西呢,这里是一个问题?

事实上是不能的,因为我们并不知道里面的通配符具体类,所以传不进来值

2.通配符的下限

 通配符的下限在main方法中只能调用当前类,或者当前类的类

class Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class Banana extends Fruit {
}
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<Food> message=new Message<>();
        message.setMessage(new Food());
        fun(message);
        
        Message<Fruit> message2=new Message<>();
        message2.setMessage(new Fruit());
        fun(message2);
    }

    public static void fun(Message<? super Fruit> tmp){
        tmp.getMessage();  
        
    }
    


}

按照上图写出的代码,可以给统配传参,明显发现,上限与下限传参是不同的,下限只能传本身与其父类 

 这里报错了,当然是最有力的说明,确实不能传其子类,那我们应该怎么给子类传参呢,这下就要通过通配符的方法了(上限不能,但是下限可以)

 这里为什么只能传下限的子类呢,因为我们并不知道当前是谁,最大的传参也只能是自己本身,这里只能依照最保险的类,来传参就当前下限的子类及其本身 

三、包装类

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

包装类的原因:

基本类型不支持Object的继承关系,所以在java中有了基本类型对应的包装类,来完成泛型需要
这里有两个特殊写法的就是Integer(int)、Character(char)

 1.包装类的自动转化

那如何来看它是怎样转化的,可以通过cmd命令去查看汇编代码 

 首先用win+r  -》输入cmd 打开命令框  输入javap -c  创建的类名

我这里就输入javap -c Test2

 以上可以对比一下,虽然我们没有写当前的Integer.value 但是在汇编的时候会有,这就是自动转包

添加已给例题

那尽然是int的包装类,为什么会两者不相同,100的就可以,但是200就不可以,说明有Integer有限定值,那限定值是多少

那通过它来看吧,这里有个low ,high

如果没有在这个范围内会创建一个新对象

点击一下low就会有以下代码

 这里能够知道当前的Integer被设定了一个值的范围,[-128,127]

2.拆包

 将包转化为基本数据类型,拆包通过cmd命令汇编

 可以手动用汇编中代码拆包,或者直接传值给基本数据类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值