Java基础(泛型的理解)

一、泛型概述

泛型的本质是参数化类型,也就是说所操作的 数据类型被指定为一个参数类型。

二、泛型类

定义泛型类在"类名"后添加一对<>,里面定义"泛型名称";

格式:如ArrayList集合

示例:

class ArrayList<E> {
	public boolean add(E e) { }
	public E get(int index) { }
}

使用泛型类:创建对象时,确定泛型的类型

例如:ArrayList<String> list = new ArrayList<String>(); 此时相当于将E的类型替换为String类型。

三、集合中使用泛型

使用泛型,规定集合元素类型必须为某种类型

示例:

        List<String> list=new ArrayList<>();
        list.add("yyy");
        list.add("wtc");
        for(int i=0;i<list.size();i++){
            String s=(String)list.get(i);
            System.out.println("获取的值为:"+s);
        }
        //aslist:将多个数据转成集合
        List<Integer> list1 = Arrays.asList(1, 2, 3);
        List<String> list2 = Arrays.asList("y", "w", "a");

四、泛型方法

定义格式:修饰符 <表示泛型方法> 返回值类型 方法名(泛型标示符 参数名称){}

示例:

mport java.util.ArrayList;
import java.util.List;

public class demo_泛型方法 {
    public static void main(String[] args) {
        //任何同类型的数据类型都可以,不在局限于只能传一种类型的数据
        List list=ArrayTools.toList("w","y");
        System.out.println(list);
        List list1=ArrayTools.toList(1,2,3);
        System.out.println(list1);
    }
}
class ArrayTools{
           //...表示参数个数任意即可变参数
    public static <T> List toList(T...e){
        List<T> list=new ArrayList<>();
        for(int i=0;i<e.length;i++){
            list.add(e[i]);
        }
        return list;
    }
}

运行结果:

五、泛型接口

格式:权限修饰符 interface 接口名<泛型标示符>{}

示例:

public class demo_泛型接口 {
    public static void main(String[] args) {
        Inter<String> inter=new InterImpl();
    }
}
interface Inter<T>{
    T getData(T t);
}
class InterImpl<T> implements Inter<T>{
    @Override
    public T getData(T s) {
        return null;
    }
}

六、泛型通配符

类型通配符一般是使用?代替具体的类型参数。

例如 List<?> 在逻辑上是List<String>,List<Integer> 等所有List<具体类型实参>的类。

示例:

import java.util.ArrayList;
import java.util.List;

public class demo_泛型通配符 {
    public static void main(String[] args) {
       List<String> strings=new ArrayList<>();
       m1(strings);
       List<Person> people=new ArrayList<>();
       List<Student> students=new ArrayList<>();
       List<Teacher> teachers=new ArrayList<>();
       m2(people);
       m2(students);
       m3(people);
       //m3(teachers);报错
    }
    //任何类型的参数都可以
    public static void m1(List<?> list){}
    //list的类型只能是Person以及Person的子类
    public static void m2(List<?extends Person> list){}
    //只能是Student类型或者是Student的父类类型
    public static void m3(List<?super Student> list){}
}
class Person{}
class Student extends Person{}
class Teacher extends Person{}

七、使用泛型的好处

可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。

  1. 类型安全
  2. 消除强制类型转换
发布了75 篇原创文章 · 获赞 164 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_41679818/article/details/96476646