Java基础 —— 泛型

createh54个月前 (01-07)技术教程52

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三种代理模式:静态代理、动态代理和cglib代理

Java静态代理Java中的静态代理是一种设计模式,它通过创建一个代理类来代替原始类,从而控制对原始类的访问。代理类和原始类都实现相同的接口,使得客户端在使用时无需关心具体的实现细节。静态代理在编译时...

详解Java 中 static 的作用

在 Java 中 static 关键字有4种使用场景,下面分别进行介绍:1.static 成员变量public class Student { // 静态成员变量 private st...

支付宝APP支付集成文档

一、开发前提适用于商家在App应用中集成支付宝支付功能。商家APP调用支付宝提供的SDK调用支付宝客户端内的支付模块,商家APP会跳转到支付宝中完成支付,支付完后跳回到商家APP内,最后展示支付结果。...

前端入门一个最简单的静态网页

前提条件:电脑有至少一个浏览器1.创建txt文件右键桌面空白处选择新建txt文件2.在搜索引擎中搜索HTML入门将图中的模板文件内容复制到TXT文件中<!DOCTYPE html><...

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

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