泛型的总结(Java)

简介: 泛型的介绍:首先,明确一下,泛型是为了给集合指定对象类型而设立的,为了解决:假设当往集合加入元素是String类型,你有没有发现一个奇怪的现象,当你把对象取出时,往往却变成了Object类型,也就是说,当你往集合里添加元素时,他不会记住你加的是什么类型,统一返回时把你当成Object类型,所以为了解决这个类型前后不一致的问题,就出现了泛型。接下来看一下泛型的实例化举例:ArrayList<String> List =new ArrayList<>();&lt

 泛型的介绍:

首先,明确一下,泛型是为了给集合指定对象类型而设立的,

为了解决:假设当往集合加入元素是String类型,你有没有发现一个奇怪的现象,当你把对象取出时,往往却变成了Object类型,也就是说,当你往集合里添加元素时,他不会记住你加的是什么类型,统一返回时把你当成Object类型,所以为了解决这个类型前后不一致的问题,就出现了泛型。

接下来看一下泛型的实例化举例:

ArrayList<String> List =new ArrayList<>();


<>里边是一些类对象。

       此时这个集合指定了往里面添加对象的数据类型(往集合中添加元素时,不能单一的添加基础数据类型:ArrayList<int> List =new ArrayList<>();类似这样),此时,制定了数据类型时,往里面添加的数据类型就有了限制,比如此时,若往里边添加integer类的数据就会报错。

为什么要使用泛型:

拿使用数据库来说,每张表可以看做一个类的对象,每个对象对应的都有自己的类,如果给每个类都定义一个操作该类对象的工具类,太过于麻烦,代码冗余性也较高,所以就出现了泛型类和泛型方法,接下来将在代码中进行详细说明:

public class DAO<T> {
    //建立一个DAO工具类,给其定义成泛型类,当操作具体类时可以根据类而改变
    //同样的,也可以定义一些泛型方法,不指定其操作的具体类型,
    // 使具体类继承该类后这些方法可以通用,降低代码冗余量
    public T save(){
      return null;
    }
    public List<T> update(){
        return null;
    }
}

image.gif

public class CustomerDAO extends DAO<Customer> {
    //此时子类的工具类继承后可以指定该DAO具体操作的类对象
    //此时这个工具类操作的就是Customer的类对象
}

image.gif

@Test
    public void test1(){
        CustomerDAO dao = new CustomerDAO();
        //此时这个save()方法操作的就是Customer对象
        dao.save();
    }

image.gif

image.gif编辑

泛型继承方面的体现:

@Test
    public void test1(){
        ArrayList<?> a1 = new ArrayList<>();
        ArrayList<String> a2 = new ArrayList<>();
        ArrayList<Object> a3 = new ArrayList<>();
        ArrayList<Integer> a4 = new ArrayList<>();
        //此时a2无法赋值给a3,证明泛型中,当A是B的父类时
        //F<A>和F<B>没有子父类的关系
        /*
        可以反证一下:假设a3=a2;
        那么当a3.add(123)时,a2中也可以出现123,那么定义泛型貌似就没了意义
         */
        a3 = a2;
        //此时a2能赋值给a1,证明G<?>是任何G<A>的父类
        a1 = a2;
        List<String> l = null;
       //此时可以赋值,证明当A是B的父类时,A<M>是B<M>的父类
        l=a2;
    }

image.gif

泛型中通配符的使用及其限制:

@Test
    public void test1(){
          //先给通配符的集合赋值为null
        List<?> list = null;
        //通配符的集合无法进行添加操作
//        list.add("aa");
        ArrayList<Integer> a4 = new ArrayList<>();
        a4.add(4);
        //但是其可以进行赋值和读取
        list = a4;
        System.out.println(list);
    }

image.gif

/**
         * <? extends A> 表示该通配符表示的类的最大父类是A,通俗的说就是这个类小于等于A
         * <? super  B>  表示该通配符表示的类的是B的父类,通俗的说就是这个类大于等于B
         */
        List<? extends Customer> m1 = null;
        List<? super  Customer> m2 =null;

image.gif


相关文章
|
16天前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
14 0
[Java]泛型
|
25天前
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
10 1
|
1月前
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
26 5
|
30天前
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
17 1
|
2月前
|
Java 编译器 容器
Java——包装类和泛型
包装类是Java中一种特殊类,用于将基本数据类型(如 `int`、`double`、`char` 等)封装成对象。这样做可以利用对象的特性和方法。Java 提供了八种基本数据类型的包装类:`Integer` (`int`)、`Double` (`double`)、`Byte` (`byte`)、`Short` (`short`)、`Long` (`long`)、`Float` (`float`)、`Character` (`char`) 和 `Boolean` (`boolean`)。包装类可以通过 `valueOf()` 方法或自动装箱/拆箱机制创建。
35 9
Java——包装类和泛型
|
1月前
|
存储 Java 编译器
【用Java学习数据结构系列】初识泛型
【用Java学习数据结构系列】初识泛型
18 2
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
30天前
|
安全 Java 编译器
Java基础-泛型机制
Java基础-泛型机制
13 0
|
2月前
|
存储 安全 搜索推荐
Java中的泛型
【9月更文挑战第15天】在 Java 中,泛型是一种编译时类型检查机制,通过使用类型参数提升代码的安全性和重用性。其主要作用包括类型安全,避免运行时类型转换错误,以及代码重用,允许编写通用逻辑。泛型通过尖括号 `&lt;&gt;` 定义类型参数,并支持上界和下界限定,以及无界和有界通配符。使用泛型需注意类型擦除、无法创建泛型数组及基本数据类型的限制。泛型显著提高了代码的安全性和灵活性。
|
1月前
|
Java
【Java】什么是泛型?什么是包装类
【Java】什么是泛型?什么是包装类
16 0