当前位置: 主页 > JAVA语言

java键值-java中怎样读取键值

发布时间:2023-05-19 11:08   浏览次数:次   作者:佚名

原文

本文内容如下:

1、 什么是类型擦除

2、常用的 ?, T, E, K, V, N的含义

3、上界通配符 < ?extends E>

4、下界通配符 < ?super E>

5、什么是PECS原则

java中怎样读取键值_backspace键值_java键值

6、通过一个案例来理解 ?和 T 和 Object 的区别

一、什么是类型擦除?

我们说Java的泛型是伪泛型,那是因为泛型信息只存在于代码编译阶段,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉java键值,这个过程为类型擦除。

泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是因为类型擦除特性,让泛型代码能够很好地和之前版本的代码兼容。

我们来看个案例

(图1)

backspace键值_java中怎样读取键值_java键值

因为这里泛型定义为Integer类型集合,所以添加String的时候在编译时期就会直接报错。

那是不是就一定不能添加了呢?答案是否定的,我们可以通过Java泛型中的类型擦除特点及反射机制实现。

如下

public static void main(String[] args) throws Exception {
        ArrayList list = new ArrayList();
        list.add(6);
        //反射机制实现
        Class clazz = list.getClass();
        Method add = clazz.getDeclaredMethod("add", Object.class);
        add.invoke(list, "欢迎关注:后端元宇宙");
        System.out.println("list = " + list);
    }

运行结果

list = [6, 欢迎关注:后端元宇宙]

backspace键值_java中怎样读取键值_java键值

二、案例实体准备

这里先建几个实体,为后面举例用

Animal类

@Data
@AllArgsConstructor
public class Animal {
    /**
     * 动物名称
     */
    private String name;
    /**
     * 动物毛色
     */
    private String color;
}

Pig类 :Pig是Animal的子类

public class Pig  extends  Animal{
    public Pig(String name,String color){
        super(name,color);
    }
}

java中怎样读取键值_java键值_backspace键值

Dog类 : Dog也是Animal的子类

public class Dog extends Animal {
    public Dog(String name,String color){
        super(name,color);
    }
}

三、常用的 ?, T, E, K, V, N的含义

我们在泛型中使用通配符经常看到T、F、U、E,K,V其实这些并没有啥区别,我们可以选 A-Z 之间的任何一个字母都可以java键值,并不会影响程序的正常运行。

只不过大家心照不宣地在命名上有些约定:

四、上界通配符 < ? extends E>

java中怎样读取键值_java键值_backspace键值

语法: 表示任何对象的集合都可以。

返回呢,这里指定的是Class,也就是返回最终是 List 集合。

再以 实体转换 方法为例

public static  T changeEntityNew(Class target, Object baseTO)

同样的,我们并不关心源对象是什么,我们只关心需要转换的对象,只需关心需要转换的对象为 T 。

那为什么这里用Object上面用?呢,其实上面也可以改成 List list ,效果是一样的,上面 List list 在遍历的时候最终不就是用Object接收的吗

?和Object的区别

?类型不确定和Object作用差不多,好多场景下可以通用,但?可以缩小泛型的范围,如:List