Java基础 —— 泛型

createh56个月前 (01-07)技术教程108

Java基础 —— 泛型

泛型

?泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。


理解

?为了可以进一步理解泛型,我们先来看一个问题

需求:
?编写一个程序,在ArrayList中添加三个对象,类中要有name、age属性,输出对象的name、age属性

  • 首先,我们先用传统方法进行编写
package com.sxny;

import java.util.ArrayList;

public class text {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add(new Person("王五",55));
        arrayList.add(new Person("李四",12));
        arrayList.add(new Person("王五",8));
        arrayList.add(new Animal("奶盖",2));
        for (Object o:arrayList){ //增强for循环
            Person person = (Person)o;
            System.out.println(person);
        }
    }
}
class Person{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class Animal{
    private String name;
    private int age;
    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

??从上图我们可以看到,用传统方法,会出现ClassCastException异常, 其原因主要是传统方法中,需要进行类型的转换。Person在进入Arraylist中时会转换成Object类型,在取出时又会转回Person类型。

  • 针对以上问题,现在我们利用泛型来解决
package com.sxny;

import java.util.ArrayList;

public class text {
    public static void main(String[] args) {
        ArrayList<Person> arrayList = new ArrayList<Person>();
        arrayList.add(new Person("王五",55));
        arrayList.add(new Person("李四",12));
        arrayList.add(new Person("王五",8));
        // arrayList.add(new Animal("奶盖",2));
        for (Object o:arrayList){ //增强for循环
            Person person = (Person)o;
            System.out.println(person);
        }
    }
}
class Person{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class Animal{
    private String name;
    private int age;
    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

?在创建Arraylist时限制了添加元素的类型, Arraylist arraylist = new Arraylist()若发现类型不符合,则会报错,并且在遍历时无需类型的转换,因此,解决了ClassCastException异常的问题。

使用泛型的好处

  • 编译时,检查添加的元素,增加了安全性。
  • 无需数据类型的转换,提高了效率。
  • 不再提示警告。

相关文章

JAVA反射机制详解,一学就会

目录何为反射?反射(Reflection),是指Java程序具有 在运行期 分析类以及修改其本身状态或行为的能力 。通俗点说 就是 通过反射我们可以 动态地 获取一个类的所有属性和方法,还可以操作这些...

springboot+thymeleaf+nginx实现页面静态化

适用场景在高并发的情况下,为了缓解服务器动态解析的压力,利用nginx处理静态文件的优点,可将系统中修改次数较少的页面进行静态化处理。自定义工具类import org.thymeleaf.Templa...

Java避坑指南——高并发场景下的性能隐藏杀手“UUID”

本文预计阅读时间:10分钟最近开发了一个新需求,要求对项目做压测,很奇怪,单机达到20万QPS之后就怎么也上不去了,增加线程之后,性能反而下降的厉害。经过一番分析,发现处理线程会block在UUID的...

Java对象中非空属性一键转Map,让你的代码飞起来

哈喽,大家好,我是木头左!引言在日常开发中,经常会遇到需要将一个Java对象中的非空属性提取出来,放到一个Map中的情况。这样的做法有很多好处,比如方便进行属性的查找、修改等操作,同时也能够提升代码的...