java-泛型-3(代码片段)

唐微港 唐微港     2022-12-13     602

关键词:

泛型类

public class Test<T extends Number> 
    private T key;

    public Test(T key) 
        this.key = key;
    

    public T getKey() 
        return key;
    

    public void setKey(T key) 
        this.key = key;
    

泛型接口

public interface Generator<T> 
    public T fun();

泛型方法

public class Test 
    public <T> T getT(T t) 
        return t;
    

    public <T extends List<Integer>> void getTs(T t) 
        System.out.println(t);
    

?无界限通配符

?表示不确定的类型

我们知道 Integer、Double、Float 等都是 Number 类的子类,所以下面的代码完全没问题的。基本类型 123 被自动装箱成 Integer 类型,而 Integer 又是 Number 类的子类,所以可以作为 printMsg 方法的实参。

public static void main(String[] args) 
    printMsg(123);

public static void printMsg(Number number) 
    System.out.println(number);

但泛型类 Generic<Number>Generic<Integer> 可以认为是两个完全没有关联的新类型,两者之间不具有任何继承关系,所以下面的代码会出现编译错误:

public static void main(String[] args) 
    Generic<Number> genericNumber = new Generic<>(123);
    Generic<Integer> genericInteger = new Generic<>(123);
    printMsg(genericNumber);  // 编译通过
    printMsg(genericInteger); // 编译出错,因为 Generic<Integer> 和 Generic<Number> 二者之间没有任何继承关系

public static void printMsg(Generic<Number> generic) //这里限定类型为Number
    System.out.println(generic.getKey());

而如果就是希望 printMsg 方法既能接收 Generic<Number> 又能够接收 Generic<Integer>类型,甚至是能够接收传入了任意实参类型的 Generic 泛型类(如 Generic<String>Generic<Random>等),则需要用到泛型通配符 ? 了:

public static void main(String[] args) 
    Generic<Number> genericNumber = new Generic<>(123);
    Generic<Integer> genericInteger = new Generic<>(123);
    printMsg(genericNumber);  
    printMsg(genericInteger); 

public static void printMsg(Generic<?> generic) 
    System.out.println(generic.getKey());

? 上限通配符

为泛型添加上边界,即传入的类型实参必须是指定类型或指定类型的子类。使用 extends 指定上限通配符。

因为 Generic<? extends Number> generic 指定了传入的类型实参必须是 Number 类或 Number 类的子类,(就是Number就为上限),所以printMsg(genericString); 出错,因为 String 不是 Number 的子类

public static void main(String[] args) 
    Generic<Number> genericNumber = new Generic<>(123);
    Generic<Integer> genericInteger = new Generic<>(123);
    Generic<Float> genericFloat = new Generic<>(0.5f);
    Generic<String> genericString = new Generic<>("Hello");
    printMsg(genericNumber);  
    printMsg(genericInteger); 
    printMsg(genericFloat);   
    printMsg(genericString);  // 编译出错

public static void printMsg(Generic<? extends Number> generic) 
    System.out.println(generic.getKey());

? 下限通配符

和上限通配符类似,下限通配符使用 super 关键字实现。(就是要为指定类的父类或该类才可以,这里下限为Integer)

因为 Generic<? super Integer> generic 指定了传入的类型实参必须是 Integer 类或 Integer 类的父类,所以 printMsg(genericFloat);printMsg(genericString); 出现编译错误,因为 Float 和 String 都不是 Integer 类的父类

public static void main(String[] args) 
    Generic<Number> genericNumber = new Generic<>(123);
    Generic<Integer> genericInteger = new Generic<>(123);
    Generic<Float> genericFloat = new Generic<>(0.5f);
    Generic<String> genericString = new Generic<>("Hello");
    printMsg(genericNumber);  
    printMsg(genericInteger); 
    printMsg(genericFloat);   // 编译出错
    printMsg(genericString);  // 编译出错

public static void printMsg(Generic<? super Integer> generic) 
    System.out.println(generic.getKey());

泛型擦除

  1. Java 的泛型只在编译阶段有效,编译过程中正确检验泛型结果后,会将泛型相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法,即泛型信息不会进入运行时阶段:

    public static void main(String[] args)     Generic<Integer> genericInteger = new Generic<>(123);    Generic<String> genericString= new Generic<>("Hello");    System.out.println(genericInteger.getClass() == genericString.getClass());  // 返回true
    

    结果返回 true ,说明虽然编译时 Generic<Integer>Generic<String> 是不同的类型,但因为泛型的类型擦除,所以编译后 genericIntegergenericString 为相同的类型。

java基础语法详解java中的泛型(代码片段)

前言:泛型的知识其实在前面Java的泛型和包装类这章介绍过了一些,但那些知识是为后面介绍Java集合框架做的铺垫,而今天这章再配合之前那章,将会完整的介绍Java中的泛型!文章目录1.前章回顾1.1泛型类的... 查看详情

java泛型和内部类(代码片段)

文章目录一、泛型的概述1.概念2.泛型的定义3.泛型的使用4.泛型的意义5.泛型是如何编译的?二、泛型的进一步使用1.泛型类的定义-类型边界Number类2.泛型方法3.泛型中的父子类型4.通配符?通配符上界通配符下界5.泛型的... 查看详情

深入java泛型(三泛型的上下边界)(代码片段)

第一章深入Java泛型三、泛型的上下边界3.1<?extendsE>:上界通配符(UpperBoundsWildcards)3.2<?superE>:下界通配符(LowerBoundsWildcards)3.3上下通配符的副作用三、泛型的上下边界?extendE是泛型的上边界࿰... 查看详情

详解java泛型(代码片段)

目录1为什么使用泛型2泛型的语法3.泛型的编译步骤3.1擦除机制3.2不可以实例化泛型类型数组4.了解裸类型5.泛型的上界6.泛型方法7.通配符(?)7.1理解通配符7.2通配符上界7.3通配符下界 8.包装类8.1基本数据类型对应包装类... 查看详情

#day11-java基础(代码片段)

...1可变参数2.2foreach输出2.3静态导入3、JDK三大主要特性——泛型3.1泛型的引出3.2泛型实现3.3通配符3.4泛型接口3.5泛型方法4、JDK三大主要特性——枚举4.1多例与枚举4.2Enum类面试题&# 查看详情

java泛型概述与应用(代码片段)

文章目录泛型1.1泛型概述1.2泛型类1.2.1示例代码1.3泛型方法1.3.1示例代码1.4泛型接口1.4.1示例代码1.5类型通配符1.5.1类型通配符:<?>1.5.2类型通配符上限:<?extends类型>1.5.3类型通配符下限:<?super类型>1.5.4泛型通配符的使用... 查看详情

java泛型(代码片段)

E-Element(在集合中使用,因为集合中存放的是元素)示例:publicclass泛型Epublicstaticvoidmain(String[]args)Integer[]stringArray=1,2,3,4,5,6,7;printArray(stringArray);/****/publicstatic<E>voidprintArray(E[]inputArray)/ 查看详情

java泛型(代码片段)

文章目录前言一、泛型1.泛型的好处2.泛型的本质3.泛型类4.泛型接口5.泛型方法5.限定类型变量6.泛型的约束和局限性7.通配符类型总结前言提示:以下是本篇文章正文内容,下面案例可供参考一、泛型1.泛型的好处1.适用于... 查看详情

java-----泛型(代码片段)

泛型1.泛型前言2.泛型接口3.泛型方法1.泛型前言泛型的本质是参数化类型,参数化类型:所操作的数据类型被指定为一个参数,将类型由原来的具体的类型参数化//泛型中:T\\E\\K\\Vimportjava.util.Arrays;//可存在多个泛... 查看详情

java泛型——自定义比较器的3种方式(代码片段)

方式一:实现Comparable接口,覆盖compareTo方法importjava.util.*;classTreeSetDemo publicstaticvoidmain(String[]args) TreeSetts=newTreeSet(); ts.add(newStudent("lisi02",22)); ts.add(newS 查看详情

初识java集合及包装类和泛型的基本使用(代码片段)

....Collection接口说明2.Collection示例3.Map接口说明4.Map实例三、泛型1.泛型的分类2.泛型的定义3.泛型背后作用时期和背后的简单原理4.泛型的使用5.泛型总结四、包装类1.基本数据类型和包装类直接的对应关系2.包装类的使用,装箱(b 查看详情

大数据必学java基础(五十五):泛型深入了解(代码片段)

文章目录泛型深入了解一、引入1、什么是泛型(Generic)2、没有泛型的时候使用集合3、JDK1.5以后开始使用泛型,集合中使用泛型4、泛型总结二、自定义泛型结构1、泛型类,泛型接口2、泛型方法3、泛型参数存在... 查看详情

java泛型是什么?一文带你吃透泛型(代码片段)

文章目录1.Java泛型2.泛型类3.泛型接口4.泛型方法5.泛型集合Java编程基础教程系列1.Java泛型Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,把类型作为参数传递。其主要的形式有泛型类,泛型接口和泛型方法。泛型概... 查看详情

java泛型常问面试题总结(代码片段)

文章目录Java泛型常问问题1.Java中的泛型是什么?使用泛型的好处是什么?2.如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?3.下面能编译通过?4.Array中可以用泛型吗?5.编写Employee类6.你可以把`List`传递给... 查看详情

java泛型常问面试题总结(代码片段)

文章目录Java泛型常问问题1.Java中的泛型是什么?使用泛型的好处是什么?2.如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?3.下面能编译通过?4.Array中可以用泛型吗?5.编写Employee类6.你可以把`List`传递给... 查看详情

java泛型(代码片段)

文章目录前言一、泛型1.泛型的好处2.泛型的本质3.泛型类4.泛型接口5.泛型方法5.限定类型变量6.泛型的约束和局限性7.通配符类型总结前言提示:以下是本篇文章正文内容,下面案例可供参考一、泛型1.泛型的好处1.适用于... 查看详情

十分钟深刻理解java高级——泛型(代码片段)

文章目录【1】什么是泛型?【2】为什么需要泛型?【3】如何使用泛型?一、泛型类和泛型接口二、一个类如何实现使用泛型接口的类?三、泛型方法的使用①什么是泛型方法?②普通方法:③泛型方法&#x... 查看详情

java泛型(代码片段)

...ent(在集合中使用,因为集合中存放的是元素)示例:publicclass泛型Epublicstaticvoidmain(String[]args)Integer[]stringArray=1,2,3,4,5,6,7;printArray(stringArray);/****/publicstatic<E>voidprintArray(E[]inputArray)//输出数组元素for(Eresult:inputArray)System.out.println(... 查看详情