首页 > 编程语言 >Java 子父类型集合之间的转换

Java 子父类型集合之间的转换

时间:2023-08-17 23:44:06浏览次数:54  
标签:Java handleData void List new 集合 animals 子父 public

假设现在有这样一个方法,入参是父类型的集合参数,这是个通用方法,你需要共用它,你现在要传子类型集合进去,怎么办?

class Animal {
}

class Dog extends Animal {
}

public class Service {
    public void doSth() {
        List<Animal> animals = new ArrayList<>();
        handleData(animals);

        List<Dog> dogs = new ArrayList<>();
        handleData(dogs); // 这里如何不报错?
    }
    
    public void handleData(List<Animal> animals) {
        // ... handle data
    }
}

直接传是不行的,会报错。有三种办法。

1、使用泛型通配符

pubic void handleData(List<? extends Animal> animals) { }

为什么这样可以?你先理解List<?>List<Object>的区别。List<?> 是一个未知类型的List,而List<Object> 是已知的但是任意类型的List。你可以把List<String>, List<Integer>赋值给List<?>,却不能把List<String>赋值给 List<Object>

List<? extends Animal>也是这个道理,它也是未知类型的,只是限定了类型上限。

2、使用泛型方法

public <T extends Animal> void handleData(List<T> animals) { }

3、最简单的办法

public void doSth() {
    List<Dog> dogs = new ArrayList<>();
    List<Animal> animals = new ArrayList<>(dogs);
    handleData(animals);
}

标签:Java,handleData,void,List,new,集合,animals,子父,public
From: https://www.cnblogs.com/cloudrich/p/17639213.html

相关文章

  • java 每天23点定时删除某个Folder下的文件
    importjava.io.IOException;importjava.nio.file.*;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.LocalTime;importjava.util.concurrent.Executors;importjava.util.concurrent.ScheduledExecutorService;importjava.util.concu......
  • Java日志系列:日志门面JCL、SLF4J
    目录一、日志门面说明二、JCL使用JCL入门JCL原理三、SLF4J使用配合自身简单日志实现(slf4j-simple)配置logback日志实现配置Log4J日志实现(需适配器)配置JUL日志实现(需适配器)添加slf4j-nop依赖(日志开关)桥接旧的日志实现框架一、日志门面说明当我们的系统变的更加复杂的......
  • 哈希表(实现 Python 中的集合 set)
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-classLinkList:classNode:def__init__(self,item=None):self.item=itemself.next=NoneclassLinkListIterator:def__init__(self,node......
  • 老杜 JavaWeb 讲解(二十一)——通过银行账户转账业务讲解MVC架构
    老杜-通过银行账户转账业务讲解MVC架构老杜-银行账户转账(mvc001)这个项目将层层迭代,最终成为MVC架构的项目。老杜第一次写代码并没有使用JDBC的封装类,但大差不差,这里即使用了之前的DBUtil.java,代码依然很杂乱。建立数据库数据库名:mvc字符集:utf8mb4排序规则:utf8mb4_unicod......
  • 在Java中print//printf//和println的区别
    1.printprint在JAVA中常常使用System.out.pirnt();的输出格式。在Java中进行一般的输出语句。例子如下: 输出 可见其不会换行。2.printfprintf在JAVA中常常使用System.out.printf();的格式。在Java中printf常用于格式转换,但需要注意不是换行输出,只用于精度转换。例子如......
  • JAVA 找不到主類
    检查代码和项目结构首先,你需要检查你的代码和项目结构是否正确。确保你的代码中有一个包含main方法的主类,并且这个类的包路径和类名都是正确的。 检查Classpath路径Classpath是用来告诉Java虚拟机(JVM)在哪里寻找需要的类文件的路径。如果你的程序依赖了一些外部的类库或者其......
  • 《Java编程思想第四版》学习笔记16
    学习了多形性的知识后,由于多形性是如此“聪明”的一种工具,所以看起来似乎所有东西都应该继承。但假如过度使用继承技术,也会使自己的设计变得不必要地复杂起来。事实上,当我们以一个现成类为基础建立一个新类时,如首先选择继承,会使情况变得异常复杂。一个更好的思路是首先选择“合成”......
  • JavaScript-数据类型
    JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型,共有六种。(ES6又新增了Symbol和BigInt数据类型,本教程不涉及。)数值(number):整数和小数(比如1和3.14)。字符串(string):文本(比如HelloWorld)。布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)。undefined:表......
  • 【技术积累】Java里的volatile关键字到底能干嘛?
    7.4最害怕的一集-volatile7.4.1最简单的一集-volatile语义(难度:⭐)读->读一个volatile必须从主内存读写->写一个volatile会把本地内存写到主内存去 7.4.2最好理解的一集-volatile保证了可见性(难度:⭐)publicclassVolatileSTest{​ ......
  • 【技术积累】Java 8 新特性
    一、Lambda表达式Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升1、举例(o1,o2)->Integer.compare(o1,o2)2、格式......