通配符的使用

简介: 通配符的使用

2 通配符的使用
我们需要的解决方案:可以接收所有的泛型类型,但是又不能够让用户随意修改。这种情况就需要使用通配符"?"来处理

public static void main(String[] args) {

    Data<Integer> data = new Data<>();
    data.setData(10);
    print(data);
    Data<String> data1 = new Data<>();
    data1.setData("woyaojindachang");
    print(data1);
}
//此处?代表可以接受任意类型,但由于类型不确定,所以无法修改
public static void print(Data<?> data) {
    System.out.println(data.getData());
}

1
2
3
4
5
6
7
8
9
10
11
12

3 通配符的上界
? extends 类:设置泛型上限

class Data {

public T data;

public T getData() {
    return this.data;
}

public void setData(T data) {
    this.data = data;
}

}
public class Test {

public static void main(String[] args) {
    Data<Integer> data = new Data<>();
    data.setData(10);
    print(data);
    Data<String> data1 = new Data<>();
    data1.setData("woyaojindachang");
    print(data1);//String不属于Number的子类
}
public static void print(Data<? extends Number> data) {
    System.out.println(data.getData());
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

这里我们设置通配符的上界为Number,所以无法传入String。

因为此时通配符里可以接受任意类型,由于类型不确定,所以无法修改。

public static void print(Data<? extends Number> data) {

    Number number = data.getData();
}

1
2
3
因为data存储的是Number和它的子类,所以可以进行读取数据。

4 通配符的下界
? super 类:设置泛型下限

public static void fun(Data<? super Integer> data) {

    data.setData(10);
}

1
2
3
可以传入的实参的类型是Integer或者Integer的父类类型,此处可以修改,因为添加的是Integer或者它的父类。

但不能接收,因为无法确定是那个父类。

四、拆箱和装箱
手动装拆箱:

public static void main(String[] args) {

    //装箱
    Integer a = Integer.valueOf(10);
    Integer b = new Integer(10);
    //拆箱
    int c = a.intValue();
}

1
2
3
4
5
6
7
每次手动装拆箱太过于麻烦,系统提供自动装拆箱。

public static void main(String[] args) {

    //自动装箱
    Integer a = 10;
    Integer b = (Integer)10;
    //自动拆箱
    int j = a;
    int k = (int)a;
}

1
2
3
4
5
6
7
8

我们打开字节码看一下,发现系统自动在编译阶段调用了Integer.valueof和Integer.intValue方法

public static void main(String[] args) {

    Integer a = 127;
    Integer b = 127;
    Integer c = 200;
    Integer d = 200;
    System.out.println(a == b);
    System.out.println(c == d);
}

1
2
3
4
5
6
7
8
经典面试题
上面这段代码会输出什么呢?

我们可以发现当数值在一定的范围内时,返回的是固定引用,只有超出范围才会new 新对象。

我们可以得出 i 是介于-128 - 127之间的。

cache数组存储着这些引用,并且final不可修改。
Byte、Short、Integer、Long这四种包装类型默认创建了[-128,127]的相应类型缓存数据,Character创建了数值在[0,127]范围的缓存数据,Boolean直接返回true或者false。

相关文章
|
SQL 开发框架 运维
Helm开发/调试的最佳实践
本文的目标不限于对Helm官方文档的翻译或解释,更在于帮助开发者能够快速编写出一个标准且合理的helm chart。 ## Helm简介 一句话描述:Helm是Kubernetes的包管理工具 ### Helm vs Operator Helm 和 Operator都可以实现在k8s上安装应用。但二者有着不同的适用场景。 Helm适用于: - 开发者群体 - 门槛低:熟悉k8s即可 -
2277 0
完美解决->“pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。”
完美解决->“pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。”
完美解决->“pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。”
|
数据采集 关系型数据库 MySQL
基于Python对二手车之家的数据采集与分析
本文介绍了基于Python的二手车之家数据采集与分析系统,通过爬虫技术获取数据并利用Pandas和NumPy等库进行数据处理与分析,旨在帮助用户了解二手车市场趋势并制定交易策略。
780 2
基于Python对二手车之家的数据采集与分析
|
存储 NoSQL 分布式数据库
数据库的演进之路:从传统到现代,技术的飞跃与应用
一、引言 数据库作为数据存储和管理的核心工具,随着信息技术的快速发展,经历了从简单到复杂、从单机到分布式的演进过程
|
存储 安全 网络安全
云服务时代的网络安全挑战与应对策略
在数字化浪潮的推动下,云计算已成为企业和个人不可或缺的信息技术基础设施。然而,随着云服务的广泛应用,网络安全问题亦日益凸显。本文旨在探讨云计算环境下的网络安全挑战,并针对这些挑战提出相应的应对措施。通过分析当前云服务中存在的安全风险,本文进一步讨论了加强网络安全防护的必要性,以及如何实施有效的安全策略以保障数据安全和业务连续性。
|
机器学习/深度学习 自然语言处理
ChatGPT 等相关大模型问题之Attention 机制的定义如何解决
ChatGPT 等相关大模型问题之Attention 机制的定义如何解决
|
机器学习/深度学习 人工智能 自然语言处理
人工智能(AI)技术的发展史
人工智能 (AI) 的发展历程从20世纪50年代起步,历经初始探索、早期发展、专家系统兴起、机器学习崛起直至深度学习革命。1950年图灵测试提出,1956年达特茅斯会议标志着AI研究开端。60-70年代AI虽取得初步成果但仍遭遇困境。80年代专家系统如MYCIN展现AI应用潜力。90年代机器学习突飞猛进,1997年深蓝战胜国际象棋冠军。21世纪以来,深度学习技术革新了AI,在图像、语音识别等领域取得重大成就。尽管AI已广泛应用,但仍面临数据隐私、伦理等挑战。未来AI将加强人机协作、增强学习与情感智能,并在医疗、教育等领域发挥更大作用。
|
机器学习/深度学习
lstm LSTM的天气预测 时间序列预测 完整代码+数据 毕业设计 可直接运行
lstm LSTM的天气预测 时间序列预测 完整代码+数据 毕业设计 可直接运行
456 0
|
机器学习/深度学习 人工智能 自然语言处理
北大、阿里妈妈成立联合实验室,产学大牛合体,图模型、博弈论都安排上了!
对于实验室的长期目标,朱松纯指出:「联合实验室要锚住国际最前沿的人工智能发展趋势,面向国民经济发展的重大需求,在通用人工智能、元宇宙、数字人等前沿方向大胆探索,注重多学科之间的交叉与融合,探索出一条具有中国特色、体现中国智慧的发展道路,为国家的人工智能发展战略做出贡献。」
327 0
北大、阿里妈妈成立联合实验室,产学大牛合体,图模型、博弈论都安排上了!
|
存储 监控 Kubernetes
DevOps 技术产品链
DevOps 技术产品链
366 0
DevOps 技术产品链