首页 > 其他分享 >泛型

泛型

时间:2024-02-25 23:03:12浏览次数:20  
标签:getBirthday name int ArrayList Dog 泛型

泛型的理解和好处

看一个需求

  1. 请编写程序,在ArrayList 中,添加3个Dog对象
  2. Dog对象含有name 和 age,并输出name 和 age (要求使用getXxx0)
    先使用传统的方法来解决 ->引出泛型
class Dog {
    public String name;
    public int age;
    public Dog(String name, int age) {
      this.name = name;
      this.age = age;
    }
    @Override
    public String toString {return "Dog [name=" + name + ", age=" + age + "]";

创建3个Dog对象,放入集合中,用foreach遍历这个集合。
for(Object obj : arrayList){}里面,需要将obj向下转型为Dog,才能拿到Dog的名字和年龄。
如果此时不小心往ArrayList添加了一个Cat对象。那么上面这个foreach遍历就会报错。
使用传统方法的问题分析

  1. 不能对加入到集合 ArrayList中的数据类型进行约束(不安全)
  2. 遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响

针对第一点可以指定ArrayList只接受Dog对象
ArrayList<Dog> arrayList = new ArrayList<Dog>();还有一个好处就是可以直接在foreach里面进行类型转化for(Dog dog : arrayList)

看菜鸟编程

泛型的声明

interface <T> {}class<K,V>{}

泛型的实例化

List<String> strList = new ArrayList<String> ();
Iterator<Customer> iterator = customers.iterator();

泛型的应用

集合的源码

泛型的使用细节

  1. 泛型接收的类型只能是引用类型,不能是基本数据类型int float
  2. 在给泛型指定具体类型后,可以传入该类型或者其子类类型
  3. 泛型的使用形式
    ArrayList<Integer> list1 = new ArrayList<Integer>();
    List<Integer> list2 = new ArrayList<Integer>();
    在实际中,往往写成
    ArrayList<Integer> list3 = new ArrayList<>();
    List<Integer> ist4 = new ArrayList<>():
  4. 如果是这样写 泛型默认是 object
    ArrayList arrayList = new ArrayList()

练习

创建3个Employee对象,存在Arraylist里面,用list的sort方法排序,要求先按名称排序,同名则按年龄排序。

class Employee{
    private String name;
    private int sal;
    private MyDate birthday;
}

class MyDate{
    private int year;
    private int month;
    private int day;
}

通过传入匿名内部类实现compare方法来进行排序。首先比较名字,再比较年龄。年龄的比较我封装成了一个方法,员工类直接调用就行。

        list.sort(new Comparator<Employee>() {
            @Override
            public int compare(Employee o1, Employee o2) {
                if (o1.getName().compareTo(o2.getName())!=0){
                    return o2.getName().compareTo(o1.getName());
                }
                return o2.compare(o1);
            }
        });

    public int compare(Employee e){
        if (this.getBirthday().getYear() != e.getBirthday().getYear()){
            return this.getBirthday().getYear() > e.getBirthday().getYear()? -1:1;
        }
        if (this.getBirthday().getMonth() != e.getBirthday().getMonth()){
            return this.getBirthday().getYear() > e.getBirthday().getYear()? -1:1;
        }
        if (this.getBirthday().getDay() != e.getBirthday().getDay()){
            return this.getBirthday().getYear() > e.getBirthday().getYear()? -1:1;
        }
        return 0;
    }

老师写法,将MyDate类实现Comparable接口,重写compare方法。

自定义泛型

基本语法

class 类名 <T,R...>{
成员
}

细节

  1. 普通成员可以使用泛型(属性、方法)
  2. 使用泛型的数组,不能初始化(不知道开辟多大空间)
  3. 静态方法中不能使用类的泛型(因为静态是和类相关的,在类加载时,对象还没有创建,如果静态方法\属性使用了泛型,JVM无法初始化)
  4. 泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
  5. 如果在创建对象时,没有指定类型,默认为Object

标签:getBirthday,name,int,ArrayList,Dog,泛型
From: https://www.cnblogs.com/tigerWei/p/17997764

相关文章

  • 泛型
     1.介绍泛型(Generics):是Java语言中一项重要特性,允许在类、接口和方法中使用参数化类型。通过泛型,可以编程通用、灵活的代码。提高代码的重用性和类型安全性。泛型是JavaSE1.5的新特性,是一种不确定的数据类型,这种不确定的数据类型需要我们在使用这个类的时候它才能够......
  • ts泛型08
    泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性 //需求:定义一个函数,传入两个参数,第一个参数是数据,第二个参数是数量,//函数的作用:根据数量产生对应个数的数据,存放在一个数组中functionGetaArr<T>(value:T,count:......
  • Flink 使用之 TypeInformation 由于泛型类型在运行时会被JVM擦除,所以要指定类型
    Flink使用之TypeInformation由于泛型类型在运行时会被JVM擦除,所以要指定类型Flink使用介绍相关文档目录Flink使用介绍相关文档目录背景本篇从近期遇到的StreamJavaAPI问题,引出TypeInformation的使用。Exceptioninthread"main"org.apache.flink.api.common.functi......
  • JAVA基础-泛型
    1,泛型概述泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型......
  • Java之泛型系列--继承父类与实现多个接口(有示例)
    原文网址:​​Java之泛型系列--继承父类与实现多个接口(有示例)_IT利刃出鞘的博客-CSDN博客​​简介本文介绍java如何用泛型表示继承父类并实现多个接口。用泛型表示某个类是某个类的子类或者实现了接口的方法为:<TextendsA&B&C> 用法1:全都是接口。对于本例来说:A、B......
  • C# 泛型方法New泛型对象
     var frm=Activator.CreateInstance<T>(); ///<summary>//////</summary>///<typeparamname="T"></typeparam>///<paramname="pnlFrm"></param>///......
  • Java 中的泛型机制
    泛型JDK5.0之后推出的新特性:泛型泛型这种语法机制,只在程序编译阶段起作用,只给编译器参考的(运行阶段没用)使用泛型的好处:集合中存储的元素统一了从集合中取出来的元素类型是泛型指定的类型,不需要进行大量的“向下转型”泛型的缺点:集合中的元素缺乏多样性importjava.util.Ar......
  • Java泛型
    参考:磊叔的技术博客 : 聊一聊-JAVA泛型中的通配符T,E,K,V,?tutorialspoint: Java-Generics Java-泛型泛型的好处在没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参......
  • 每日一道Java面试题:说一说Java中的泛型?
    写在开头今天的每日一道Java面试题聊的是Java中的泛型,泛型在面试的时候偶尔会被提及,频率不是特别高,但在日后的开发工作中,却是是个高频词汇,因此,我们有必要去认真的学习它。泛型的定义什么是泛型?什么是泛型?这是个好问题,JDK5更新时带来了一个新特性-泛型,所谓“泛型”就是类型参......
  • Go官方放出泛型slices包
    阅读本文大概需要6分钟。slices 标准库是Go1.21新增的一个包,它提供了许多对切片(slices)进行常见操作的泛型函数,可以适用于任何元素类型的切片。切片是Go语言中一种重要的数据结构,它可以动态地存储和管理一组相同类型的元素。切片的底层实现是一个数组,但是切片可以根据需要......