java泛型的使用(超详细)(代码片段)

王小麻子 王小麻子     2023-04-03     428

关键词:

目录

1、概念

2、优点

3、泛型使用实例

4、泛型使用细节

5、自定义泛型类

6、自定义泛型接口

7、自定义泛型方法


1、概念

        Java泛型是JDK1.5中引⼊的⼀个新特性,其本质是参数化类型,把类型作为参数传递。 常⻅形式有泛型类、泛型接⼝、泛型⽅法。

2、优点

        1)编译时,检查添加元素的类型,提高了安全性

        2)减少了类型转换次数,提高了效率

public class Test 
    public static void main(String[] args) 
        ArrayList<Dog> arrayList = new ArrayList<>();
        arrayList.add(new Dog("贝贝",5));
        arrayList.add(new Dog("乐乐",3));
        arrayList.add(new Dog("小黑",4));
        //arrayList.add(new Cat("贝贝",5));   错误
        for (Dog dog : arrayList) 
            System.out.println(dog.getName()+"-"+dog.getAge());
        
    

3、泛型使用实例

public class Test 
    public static void main(String[] args) 
        HashSet<Student> hashSet = new HashSet<>();
        hashSet.add(new Student("张三",22));
        hashSet.add(new Student("李四",23));
        hashSet.add(new Student("王五",24));
​
        //遍历
        for (Student student : hashSet) 
            System.out.println(student);
        
        //使用泛型方式给HashMap放入三个学生对象
        HashMap<String, Student> hashMap = new HashMap<>();
        hashMap.put("Tom",new Student("Tom",22));
        hashMap.put("Jack",new Student("Jack",23));
        hashMap.put("Smith",new Student("Smith",24));
​
        //迭代器 entrySet
        Set<Map.Entry<String, Student>> entrySet = hashMap.entrySet();
        Iterator<Map.Entry<String, Student>> iterator = entrySet.iterator();
        System.out.println("===========================");
        while (iterator.hasNext()) 
            Map.Entry<String, Student> next = iterator.next();
            System.out.println(next.getKey()+"-"+next.getValue());
        
    

4、泛型使用细节

        1)interface List<T>,public class HashSet<E>...等等

                T、E只能是引用类型

ArrayList<Integer> list1 = new ArrayList<>(); //正确
ArrayList<int> list2 = new ArrayList<int>();  //错误

        2)在给泛型指定具体类型后,可以传入该类型或者其子类类型

public class Demo03 
    public static void main(String[] args) 
        //因为E制定了A类型,构造器传入了new A
        //在给泛型指定具体类型后,可以传入该类型或者其子类类型
        Pig<A> pig = new Pig<A>(new A());
        Pig<A> pig1 = new Pig<A>(new B());
    

class A
class B extends A
​
class Pig<E>
    E e;
    public Pig(E e) 
        this.e = e;
    

        3)在实际开发中,我们往往简写

ArrayList<Integer> list = new ArrayList<Integer>();
//简写
ArrayList<Integer> list1 = new ArrayList<>();

5、自定义泛型类

        注意细节:

                1)普通成员可以使用泛型

public class AA<T,R> 
    T t;
    R r;

                2)使用泛型的数组,不能初始化

public class AA<T,R> 
    T t;
    R r;
    T[] ts;
    //T[] ts =new T[4];  不能初始化

                3)静态方法中不能使用类的泛型

//因为静态时和类相关,在类加载时,对象还没创建,所以静态属性和静态方法使用了泛型,JVM就无法完成初始化
//    static R r2;
//    public static void m(T t)

                4)泛型类的类型是在创建对象时确定的

                5)如果创建对象时没有指定类型,默认为Object

6、自定义泛型接口

        注意细节:

                1)接口中,静态成员也不能使用泛型

                2)泛型接口的类型,在继承接口或实现接口时确定

                3)没有指定类型,默认为Object

public interface IUsb<U,R> 
    int n=10;
    //U name;   不能这样使用,静态成员不能使用泛型
    //普通方法,可以使用接口泛型
    U get(U u);
    void hi(R r);
    void run(R r1,R r2,U u1,U u2);
    //在JDK8中,可以在接口中,使用默认方法,也是可以使用泛型
    default R method(U u)
        return null;
    
public interface IA extends IUsb<String, Double> 
public class AA implements IA 
    //当我们去实现IA接口时,因为IA在继承IUsb接口时,制定了U为String,R为Double
   //在实现IUsb接口的方法时,使用String替换U,Double替换R
    @Override
    public String get(String s) 
        return null;
    
​
    @Override
    public void hi(Double aDouble) 
​
    
​
    @Override
    public void run(Double r1, Double r2, String u1, String u2) 
​
    

7、自定义泛型方法

        注意细节:

                1)泛型方法,可以定义在普通类中,也可以定义在泛型类中

class Car//普通类
    public void run()//普通方法
​
    
    public<T,R> void fly(T t,R r)//泛型方法
​
    

class fish<T,R>//泛型类
    public void run()
​
    
    public <U,M>void eat(U u, M m)
​
    

        2)当泛型方法被调用时,类型会确定

public class Test 
    public static void main(String[] args) 
        Car car = new Car();
        //当调用方法时,传入参数,编译器就会确定类型
        car.fly("宝马",100);
    

        3) public void swim(T t)不是泛型方法,而是使用了类声明的泛型。

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

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

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

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

java泛型(代码片段)

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

深入java泛型一泛型的作用与定义(代码片段)

第一章深入Java泛型一、泛型的作用与定义1.1泛型的作用1.2泛型的定义1.3泛型擦除一、泛型的作用与定义1.1泛型的作用使用泛型能写出更加灵活通用的代码。泛型的设计主要参照了C++的模板,旨在能让你写出更加通用化&... 查看详情

java泛型简介定义和使用含有泛型的类定义和使用含有泛型的方法定义和使用含有泛型的接口泛型通配符?受限泛型(代码片段)

泛型简介:集合中存储数据的类型称之为泛型,泛型是一种未知的数据类型,当不知道使用什么数据类型的时候可以使用泛型;当创建对象时在指明数据类型并赋值给泛型即可;泛型也可以看做是一个变量ÿ... 查看详情

java自用集合中使用泛型的练习(代码片段)

发现泛型用起来好方便!!!!!!!😐😐集合中使用泛型总结:①集合接口或集合类在jdk5.0时都修改为带泛型的结构。②在实例化集合类时,可以指明具体的泛型类型③指明完以后&#x... 查看详情

java?不定类型与泛型的使用解决list继承参数(代码片段)

?表示不确定的数据类型。下面我们来看看怎么使用。定义模型和子模型@DatapublicclassModelStringid;Stringname;Stringdesc;@DatapublicclassSubModelextendsModelStringsubName;定义List泛型接口和实现publicinterfaceMultiModelService/***多模 查看详情

java_泛型笔记(代码片段)

文章目录Java_泛型简介Java_泛型的概念Java_为什么存在泛型Java_自定义泛型结构Java_泛型的声明Java_泛型的实例化Java_泛型类Java_泛型方法Java_泛型在继承上的体现Java_通配符的使用Java_泛型简介集合容器类在设计阶段/声明阶段不能确... 查看详情

详解java泛型(代码片段)

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

java基础:泛型的具体介绍与使用(代码片段)

...得我的文章不错,记得一键三连,感谢~文章目录泛型一、为什么要有泛型(Generic)1、泛型:标签2、举例:3、泛型的设计背景:4、泛型的概念5、那么为什么要有泛型呢,直接Object不是也可以存储数据吗࿱... 查看详情

java泛型的读写规则:pecs(代码片段)

PECS是“ProducerExtendsConsumerSuper”的缩写,是Java泛型中的重要用法。PECS就是当你需要遍历某一个类型和子类的集合数据时,集合相当于生产者,此时泛型使用<?extendsT>。当需要往某个类型的集合添加类和子类实例时... 查看详情

java泛型的读写规则:pecs(代码片段)

PECS是“ProducerExtendsConsumerSuper”的缩写,是Java泛型中的重要用法。PECS就是当你需要遍历某一个类型和子类的集合数据时,集合相当于生产者,此时泛型使用<?extendsT>。当需要往某个类型的集合添加类和子类实例时... 查看详情

java泛型的读写规则:pecs(代码片段)

PECS是“ProducerExtendsConsumerSuper”的缩写,是Java泛型中的重要用法。PECS就是当你需要遍历某一个类型和子类的集合数据时,集合相当于生产者,此时泛型使用<?extendsT>。当需要往某个类型的集合添加类和子类实例时... 查看详情

java遗珠之泛型的作用(代码片段)

泛型总共有三个作用编译时进行更强大的类型检查编译时错误比运行时错误更好发现和处理消除类型转换Listlist=newArrayList();list.add("hello");Strings=(String)list.get(0);使用泛型之后去掉转换List<String>list=newArrayList<Str... 查看详情

java中泛型的深入理解(代码片段)

文章目录泛型深入泛型基本介绍自定义泛型类自定义泛型方法自定义泛型接口泛型通配符和上下限泛型深入泛型基本介绍泛型的概述:泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。泛... 查看详情

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

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

java笔记一问三不知------泛型的秘密(代码片段)

(还没有前言提要,后期补上:)泛型的创建和实例化1.常见创建使用(1)创建一个泛型类publicclassWrapper<T>privateTinstance;publicTgetInstance()returninstance;publicvoidsetInstance(Tinstance)this. 查看详情

java泛型(代码片段)

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