JAVA基础-泛型

文章目录

泛型

​ 泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制

1.泛型的好处

  • 统一数据类型。
  • 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来

2.泛型的细节

  • 泛型中不能写基本数据类型'
  • 指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型
  • 如果不写泛型,类型默认是Object

3.泛型类

使用场景

当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类

格式

修饰符 class 类名<类型>{}

举例:

public class ArrayList < E > {
创建该类对象时,E就确定类型}

代码示例

构建泛型类

java 复制代码
//当我在编写一个类的时候,如果不确定类型,那么这个类就可以定义为泛型类。
public class MyArrayList<E> {

    Object[] obj = new Object[10];
    int size;

//    E : 表示是不确定的类型。该类型在类名后面已经定义过了。
//    e:形参的名字,变量名
    public boolean add(E e){
        obj[size] = e;
        size++;
        return true;
    }

    public E get(int index){
        return (E)obj[index];
    }
    
    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}

使用泛型类

java 复制代码
    public static void main(String[] args) {
        //String类型
        MyArrayList<String> list = new MyArrayList<>();

        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        System.out.println(list);
        
        //Integer类型
        MyArrayList<Integer> list2 = new MyArrayList<>();
        list2.add(123);
        list2.add(456);
        list2.add(789);

        int i = list2.get(0);
        System.out.println(i);
        System.out.println(list2);    
}

4.泛型方法

使用场景

方法中形参类型不确定时:

方案①:使用类名后面定义的泛型

方案②:在方法申明上定义自己的泛型

格式

修饰符 <类型>返回值类型 方法名(类型 变量名){}

举例:

public <T> void show (T t){}

代码示例

定义一个工具类:ListUtil

类中定义一个静态方法addAll,用来添加多个集合的元素。

java 复制代码
package a04mygenerics;

import java.util.ArrayList;

public class ListUtil {
    private ListUtil(){}
    //类中定义一个静态方法addAll,用来添加多个集合的元素。


    /*
    *   参数一:集合
    *   参数二~最后:要添加的元素
    *
    * */
    public static<E> void addAll(ArrayList<E> list, E e1,E e2,E e3,E e4){
        list.add(e1);
        list.add(e2);
        list.add(e3);
        list.add(e4);
    }

/*    public static<E> void addAll2(ArrayList<E> list, E...e){
        for (E element : e) {
            list.add(element);
        }
    }*/


    public void show(){
        System.out.println("尼古拉斯·纯情·天真·暖男·阿玮");
    }
}
java 复制代码
    public static void main(String[] args) {

        ArrayList<String> list1 = new ArrayList<>();
        ListUtil.addAll(list1, "aaa", "bbb", "ccc", "ddd");
        System.out.println(list1);


        ArrayList<Integer> list2 = new ArrayList<>();
        ListUtil.addAll(list2,1,2,3,4);
        System.out.println(list2);

    }

5.泛型接口

在接口名后面定义泛型,实现类确定类型,实现类延续泛型

修饰符 interface 接囗名<类型>{}

public interface List< E >{}

如何使用它:

1.实现类给出具体的类型

2.实现类延续泛型,创建实现类对象时再确定类型

6.泛型的继承

泛型不具备继承性,但是数据具备继承性

java 复制代码
package a04mygenerics;


import java.util.ArrayList;

public class GenericsDemo5 {
    public static void main(String[] args) {
        //创建集合的对象
        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();

        //调用method方法
        method(list1);
        method(list2);//报错,泛型不具备继承性
        method(list3);//报错,泛型不具备继承性

        list1.add(new Ye());
        list1.add(new Fu());//可以添加成功,数据具备继承性
        list1.add(new Zi());//可以添加成功,数据具备继承性
    }

    /*
    * 此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。
    * */
    public static void method(ArrayList<Ye> list) {

    }
}

7.泛型的通配符

此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。弊端:

利用泛型方法有一个小弊端,此时他可以接受任意的数据类型

Ye Fu zi Student

希望:本方法虽然不确定类型,但是以后我希望只能传递Ye Fu zi,此时我们就可以使用泛型的通配符

通配符

? 也表示不确定的类型,他可以进行类型的限定

? extends E:表示可以传递E或者E所有的子类类型

? super E:表示可以传递E或者E所有的父类类型

使用场景

定义类、方法、接口的时候,如果类型不确定,就可以定义泛型

如果类型不确定,但是能知道是哪个继承体系中的,可以使用泛型的通配符

通配符关键点:可以限定类型的范围。

相关推荐
C++业余爱好者3 分钟前
.NET线程池ThreadPool.QueueUserWorkItem
java·数据库·.net
.豆鲨包5 分钟前
【Android】Android内存缓存LruCache与DiskLruCache的使用及实现原理
android·java·缓存
superlls6 分钟前
(Java基础)集合框架继承体系
java·开发语言
ad钙奶长高高8 分钟前
【C语言】原码反码补码详解
c语言·开发语言
宋哈哈11 分钟前
页面水印sdk源码
java·前端·javascript
你不是我我36 分钟前
【Java 开发日记】我们来说一下 Mybatis 的缓存机制
java·spring·mybatis
咪咪渝粮40 分钟前
112.路径总和
java·数据结构·算法
WKP941841 分钟前
原型设计模式
java·设计模式
IoT智慧学堂41 分钟前
C语言运算符与表达式详解——算术、逻辑与赋值的全面理解
c语言·开发语言