广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java泛型通配符的使用详解
  • 163
分享到

Java泛型通配符的使用详解

Java泛型通配符 2023-01-13 12:01:36 163人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录泛型在继承方面的体现通配符的使用 有限制条件的通配符的使用自定义泛型的测试泛型在继承方面的体现 类A是类B的父类,G<A>和G<B>二者不具有子

泛型在继承方面的体现

类A是类B的父类,G<A>和G<B>二者不具有子父类关系,二者是并列关系

@Test
    public void test1() {
        Object obj=null;
        String str=null;
        obj=str;//编译通过
        
        Object[] arr1=new Object[10];
        String arr2[]=new String[10];
        arr1=arr2;//编译通过
        
        //此时的list1和list2不具有子父类关系
        List<Object> list1=null;
        List<String> list2=null;
        
        //编译不通过
        list1=list2;
        
        show(list1);
        //编译不通过
        show(list2);
    }
    
    public void show(List<Object> list) {
        
    }

类A是类B的父类,A<G>是B<G>的父类

@Test
    public void test2() {
        AbstractList<String> list1=null;
        List<String> list2=null;
        ArrayList<String>list3=null;
        
        list1=list3;//编译通过
        list2=list3;//编译通过
    }

通配符的使用

通配符?

类A是类B的父类,G<A>和G<B>是没有关系的,二者共同父类是:G<?> 

    @Test
    public void test4() {
        List<Object> list1=null;
        List<String> list2=null;
        
        List<?> list=null;
        
        list=list1;//编译通过
        list=list2;//编译通过
        print(list1);//编译通过
        print(list2);//编译通过
    }
    
    public void print(List<?> list) {
        Iterator<?> it=list.iterator();
        while(it.hasNext()) {
            Object obj=it.next();
            System.out.println(obj);
        }
    }

使用通配符后,数据的写入和读取要求

添加:对于List<?>就不能向其内部添加数据,除了添加null之外

获取:允许读取数据,读取的数据类型为Object

@Test
    public void test5() {
        List<?> list=null;
        List<String> list3=new ArrayList<>();
        list3.add("AAA");
        list3.add("BBB");
        list3.add("CCC");
        
        list=list3;
        //添加:对于List<?>就不能向其内部添加数据。
        //除了添加null之外
        
        list.add("DD"); //编译不通过
        list.add("?");    //编译不通过
        
        list.add(null);    //编译通过
        
        //获取:允许读取数据,读取的数据类型为Object
        Object obj = list.get(0);
        System.out.println(obj);
    }

 有限制条件的通配符的使用

 ? extends A:
       G<? extends A>可以作为G<A>和G<B>的父类,其中,B是A的子类

        G存储的是A和A的子类
 ? super Person:
        G<? super A>可以作为G<A>和G<B>的父类,其中,B是A的父类

G存储的是A和A的父类

@Test
    public void test6() {
        List<? extends Person> list1=null;
        List<? super Person> list2=null;
        
        List<Student> list3=new ArrayList<>();
        List<Person> list4=new ArrayList<>();;
        List<Object> list5=new ArrayList<>();;
        
        list1=list3; //编译通过
        list1=list4; //编译通过
        list1=list5; //编译不通过
        
        list2=list3; //编译不通过
        list2=list4; //编译通过
        list2=list5; //编译通过
        
        //读取数据
        list1=list3;
        Person p = list1.get(0); //编译通过
        Student st=list1.get(0); //编译不通过
        
        list2=list4;
        Object obj = list2.get(0); //编译通过
        Person obj2=list2.get(0); //编译不通过
        
        //写入数据
        list1.add(new Student()); //编译不通过
        
        list2.add(new Person()); //编译通过
        list2.add(new Student()); //编译通过
    }

自定义泛型的测试

User类 

public class User {
 
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + id;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (age != other.age)
            return false;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", age=" + age + ", name=" + name + "]";
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public User() {
        
    }
    private int id;
    public User(int id, int age, String name) {
        super();
        this.id = id;
        this.age = age;
        this.name = name;
    }
    private int age;
    private String name;
}

 DAO类

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 

public class DAO<T> {
 
    private Map<String,T> map;
    
    public DAO() {
        map=new HashMap<>();
    }
    
    //保存T类型对象到Map变量中
    public void save(String id ,T entity) {
        map.put(id, entity);
    }
    
    //从map中获取id对应的对象
    public T get(String id) {
        return map.get(id);
    }
    
    //替换map中key为id的内容,改为entity对象
    public void update(String id,T entity) {
        if(map.containsKey(id)) {
            map.put(id, entity);
        }
    }
    
    //返回map中存放的所有T对象
    public List<T> list(){
        //错误的
//        Collection<T> values = map.values();
//        return (List<T>) values;
        //正确的
        List<T> list=new ArrayList<>();
        Collection<T> values = map.values();
        for(T t:values) {
            list.add(t);
        }
        return list;
    }
    
    //删除指定id对象
    public void delete (String id) {
        map.remove(id);
    }
}

DAOTest

import java.util.List;
 
import org.junit.jupiter.api.Test;
 
public class DAOTest {
 
    @Test
    public void testList() {
        DAO<User> dao = new DAO<>();
        dao.save("1001", new User(1001,34,"周杰伦"));
        dao.save("1002", new User(1002,20,"昆凌"));
        dao.save("1003", new User(1002,20,"蔡依林"));
        
        List<User> list = dao .list();
        list.forEach( i->System.out.println(i));
        
    }
    
    @Test
    public void testUpdate() {
        DAO<User> dao = new DAO<>();
        dao.save("1001", new User(1001,34,"周杰伦"));
        dao.save("1002", new User(1002,20,"昆凌"));
        dao.save("1003", new User(1002,20,"蔡依林"));
        
        dao.update("1003", new User(1003,40,"方文山"));
        
        List<User> list=dao.list();
        list.forEach(i->System.out.println(i));
    }
    
    @Test
    public void testDelete() {
        DAO<User> dao = new DAO<>();
        dao.save("1001", new User(1001,34,"周杰伦"));
        dao.save("1002", new User(1002,20,"昆凌"));
        dao.save("1003", new User(1002,20,"蔡依林"));
        
        dao.delete("1003");
        
        List<User> list=dao.list();
        list.forEach(i->System.out.println(i));
    }
}

到此这篇关于Java泛型通配符的使用详解的文章就介绍到这了,更多相关Java泛型通配符内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java泛型通配符的使用详解

本文链接: https://www.lsjlt.com/news/177615.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java泛型通配符的使用详解
    目录泛型在继承方面的体现通配符的使用 有限制条件的通配符的使用自定义泛型的测试泛型在继承方面的体现 类A是类B的父类,G<A>和G<B>二者不具有子...
    99+
    2023-01-13
    Java泛型通配符
  • Java基础之java泛型通配符详解
    前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型,也...
    99+
    2022-11-12
  • java泛型通配符怎么使用
    Java泛型通配符用于表示未知类型。在泛型类、接口和方法中使用通配符可以使其具有更大的灵活性。通配符有三种使用方式:1. 上界通配符...
    99+
    2023-09-16
    java
  • Java超详细分析泛型与通配符
    目录1.泛型1.1泛型的用法1.1.1泛型的概念1.1.2泛型类1.1.3类型推导1.2裸类型1.3擦除机制1.3.1关于泛型数组1.3.2泛型的编译与擦除1.4泛型的上界1.4.1...
    99+
    2022-11-13
  • 最新Java 泛型中的通配符讲解
    目录一、什么是类型擦除?二、案例实体准备三、常用的 ?, T, E, K, V, N的含义四、上界通配符 < extends E>五、下界通配符 < super...
    99+
    2022-11-13
  • Java 泛型的上界和下界通配符示例详解
    目录介绍上界下界上下界通配符总结介绍 Java中的泛型是一种强类型的机制,允许我们在编译时检查类型的安全性,以避免在运行时出现类型转换异常。泛型的上界和下界用于限制泛型类型参数的范...
    99+
    2023-05-14
    Java 泛型的上界和下界 Java 泛型
  • Java中有哪些泛型通配符
    今天就跟大家聊聊有关Java中有哪些泛型通配符,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式...
    99+
    2023-06-14
  • Java泛型的上界和下界通配符怎么使用
    今天小编给大家分享一下Java泛型的上界和下界通配符怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。上界泛型的上界指定...
    99+
    2023-07-05
  • Java中泛型与通配符的示例分析
    这篇文章主要介绍Java中泛型与通配符的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!题外话: 泛型与通配符是Java语法中比较难懂的两个语法,学习泛型和通配符的主要目的是能够看懂源码,实际使用的不多。1.泛...
    99+
    2023-06-29
  • Java 泛型详解(超详细的java泛型方法解析)
    目录2. 什么是泛型3. 使用泛型的好处4. 泛型的使用4.1 泛型类4.2 泛型方法4.3 泛型接口5. 泛型通配符5.1 通配符基本使用5.2 通配符高级使用6. 总结1. 为什...
    99+
    2022-11-12
  • 一文带你搞懂Java中的泛型和通配符
    目录概述泛型介绍和使用泛型类泛型方法类型变量的限定通配符使用无边界通配符通配符上界通配符下界概述 泛型机制在项目中一直都在使用,比如在集合中ArrayList<String, ...
    99+
    2022-11-13
  • 详解Java中的泛型
    目录一.什么是泛型二.泛型类的使用2.1泛型类的定义2.2泛型类的数组使用三.泛型的上界四.泛型的方法五.泛型与集合一.什么是泛型 当我们不确定数据类型时,我们可以暂时使用一个字母 ...
    99+
    2023-05-19
    Java泛型 Java泛型类
  • 带大家认识Java语法之泛型与通配符
    目录⭐️前面的话⭐️1.泛型1.1泛型的用法1.1.1泛型的概念1.1.2泛型类1.1.3类型推导1.2裸类型1.3擦除机制1.3.1关于泛型数组1.3.2泛型的编译与擦除1.4泛型...
    99+
    2022-11-13
  • Java中泛型使用实例详解
    Java中泛型使用泛型作用:泛型:集合类添加对象不用强转反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码:ArrayList<Ls> ff=new ArrayList()<Ls>;Ls ls1...
    99+
    2023-05-31
    java 泛型 ava
  • Java中泛型的示例详解
    目录泛型概述使用泛型的好处泛型的定义与使用定义和使用含有泛型的类含有泛型的方法含有泛型的接口泛型通配符通配符基本使用通配符高级使用----受限泛型泛型概述 我们都知道集合中是可以存放...
    99+
    2022-11-13
    Java泛型机制 Java泛型
  • java 泛型的详解及实例
    java 泛型的详解及实例Java在1.5版本中增加了泛型,在没有泛型之前,从集合中读取每一个对象都需要进行强转,如果一不小心插入了类型错误的对象,在运行时就会报错,给日常开发带来了很多不必要的麻烦,比如以下代码:public class ...
    99+
    2023-05-31
    java 泛型 ava
  • 详解Java和Kotlin中的泛型
    详解Java和Kotlin中的泛型?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、泛型类型泛型允许你定义带类型形参的数据类型,当这种类型的实例被创建出来后,类型形参便被替换为...
    99+
    2023-06-15
  • Java的类型擦除式泛型详解
    Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw...
    99+
    2022-11-12
  • Java泛型在集合使用与自定义及继承上的体现和通配符的使用
    泛型的概念 集合容器类在设计阶段/声明阶段不能确定这个容器实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时...
    99+
    2022-11-12
  • 精通Java泛型的使用与原理
    目录泛型之前通过继承设计通用程序泛型Java泛型的实现原理原始类型突破泛型约束泛型方法的类型推断正确的运转泛型相关问题1、泛型类型引用传递问题2、泛型类型变量不能是基本数据类型3、运...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作