为什么有泛型、如何使用泛型-猿来绘Java-53

1. 为什么要有泛型

首先看一段代码, 没有泛型的时候,对于一个List,我们可以随意添加任意类型的对象,相比数组,只能添加某一种类型的数据,这其实是List的弊端。

什么类型都可以添加,造成了数据的混乱,不便于管理和维护。

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(111);
        list.add("ylaihui");
        list.add(new Date());
    }
}

对List增加了标签(也就是泛型)之后, 对可添加的数据进行了约束,使得更加规范,在IDEA编译器中,我们发现对ArrayList增加了泛型后, 添加的数据类型不匹配,编译都不能通过。Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生

ClassCastException异常。同时,代码更加简洁、健壮。

//ArrayListTest1.java
package com.ylaihui.generic;

import java.util.ArrayList;
import java.util.Date;

public class ArrayListTest1 {
    public static void main(String[] args) {
        ArrayList<String> strs = new ArrayList<>();
        // 编译时就对类型进行检查,保证了数据的安全和一致性
        strs.add(111); //Required type: String Provided: int
        strs.add(new Date()); 
    }
}

 

泛型就是一个标签,一个类型参数。类型不能为基本数据类型,需要是Object 体系的类类型。

集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象, 所以在JDK1.5之前只能把元素类型设计为Object, JDK1.5之后使用泛型来解决。 为这个时候除了元素的类型不确定, 其他的部分是确定的, 例如关于这个元素如何保存, 如何管理等是确定的, 因此此时把元素的类型设计成一个参数, 这个类型参数叫做泛型。 Collection<E>, List<E>, ArrayList<E> 这个<E>就是类型参数, 即泛型

2. 集合中使用泛型(使用集合时,建议使用泛型)

 

① 集合接口或集合类在jdk5.0时都修改为带泛型的结构。

② 在实例化集合类时,可以指明具体的泛型类型,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型。比如:List 中的方法 add(E e) , 实例化以后:add(Integer e)

④ 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,使用包装类替换

⑤ 如果实例化时,没有指明泛型的类型。默认类型为java.lang.Object类型。

//GenericTest1.java
package com.ylaihui.generic;

import org.junit.Test;

import java.util.*;

public class GenericTest1 {

    @Test
    public void test1() {
        ArrayList<Double> ds = new ArrayList<>();
        ds.add(11.11);
        ds.add(22.22);
        // 确定了类型,不需要将Object类型转换其他类型
        Iterator<Double> iterator = ds.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    @Test
    public void test2() {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("ylaihui", 111);
        map.put("ylai", 222);
        // 确定了类型,更加方便、安全的操作集合数据
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Integer> next = iterator.next();
            System.out.println(next.getKey() + ":" + next.getValue());
        }
    }
}

おすすめ

転載: blog.csdn.net/asdfjklingok/article/details/118702223