通配符的使用

简介: 通配符的使用

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。

相关文章
|
7月前
正则表达式2
正则表达式
|
8月前
|
数据采集 前端开发 JavaScript
正则表达式
正则表达式
64 0
|
机器学习/深度学习 程序员 vr&ar
正则表达式的使用
正则表达式的使用
64 0
最全常用正则表达式大全
最全常用正则表达式大全
|
前端开发 JavaScript Java
正则表达式(极其适合零基础)
正则表达式(极其适合零基础)
162 0
正则表达式(极其适合零基础)
|
人工智能 数据安全/隐私保护
一些常用的正则表达式
今天在写一些输入验证的时候用到了正则表达式,现在就回顾一下我们常用的正则表达式,对于正则表达式的写法很多种,看个人的习惯了,我的写法也许不是很好,但可以满足基本需求。
111 0
|
XML PHP 数据安全/隐私保护
常用的正则表达式
正则表达式是一种描述字符串结构的语法规则,是一种特定的格式化模式,用于验证各种字符串是否匹配(Match)这个特征,进而实现高级的文本查找、替换、截取等操作。 正则表达式在发展过程中出现了多种形式,一种是POSIX规范兼容的表达式,另一种是当Perl(一种功能丰富的编程语言)发展起来后,衍生出来的PCRE(Perl兼容正则表达式)库,使得许多开发人员将PCRE整合到自己的语言中,PHP中也未PCRE库的使用提供了相应的函数。
183 0