Java基础 —— 泛型

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 中的静态字段和静态方法

还记得我们写的第一个 Java 代码吗?public class Main { public static void main(String[] args) { System....

Java程序员必备技能:静态方法的正确使用姿势!

“静态方法是Java中的一种方法,它属于类而不是类的实例,这意味着你可以在不创建类的实例的情况下调用它,直接通过类名来访问,静态方法在内存中只有一份,无论该类被实例化多少次,它的静态方法都只有一份。”...

Java:什么是静态代理?什么是动态代理?二者有何区别?

推荐学习微服务架构秘籍:SpringCloud+SpringCloud Alibaba,全网疯传肝了30天,整出这份[分布式宝典:限流+缓存+通讯],秋招跳槽有望听说你很懂源码?Spring读懂了?还...

面试官:为什么java中静态方法不能调用非静态方法和变量?

这个可能很多人之前学习jvm的时候都会遇到,属于一个小问题,写这篇文章的原因是我在看java相关的面试题目中遇到的,因此顺手总结一下:一、例子我们先看效果:我们在静态方法main中调用非静态变量或者是...

为何要在Java中使用静态类?

在Java中,static关键字可以被用于变量,类,代码块和方法。当我们使用static关键字去修饰它们之中的任何一个时,意味着这个指定的成员从属与这个类型本身。换言之, 一个静态成员被创建完成后可以...

Java的“泛型”特性,你以为自己会了?(万字长文)

使用Java的小伙伴,对于Java的一些高级特性一定再熟悉不过了,例如集合、反射、泛型、注解等等,这些可以说我们在平时开发中是经常使用到的,尤其是集合,基本是只要写代码没有用不到的,今天我们先来谈谈泛...