日升时奋斗,日落时自省
目录
二、泛型通配符
通配符不予上界相同,通配符有上限有下限
通配符上限会使用: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();
}
}
按照上图写出的代码,可以给统配传参,明显发现,上限与下限传参是不同的,下限只能传本身与其父类
这里报错了,当然是最有力的说明,确实不能传其子类,那我们应该怎么给子类传参呢,这下就要通过通配符的方法了(上限不能,但是下限可以)
这里为什么只能传下限的子类呢,因为我们并不知道当前是谁,最大的传参也只能是自己本身,这里只能依照最保险的类,来传参就当前下限的子类及其本身
三、包装类
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
包装类的原因:
基本类型不支持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命令汇编
可以手动用汇编中代码拆包,或者直接传值给基本数据类型