泛型

泛型

Object类是最上层的父类,为使程序更通用,设计程序时通常将传入的的值与返回值都以Object类型为主。当使用这些实例时,必须转换为它原来的类型,否则会异常。为预防异常问题,提供了泛型机制

语法:

类名<T>

T是泛型的名称,代表一种类型,需手动指定类型,若没有指定,则采用Object类型

public class Book<T> {
    private T bookInfo;
    public Book(T bookInfo){
        this.bookInfo=bookInfo;
    }
    public T getBookInfo(){
        return bookInfo;
    }

    public static void main(String[] args) {
        Book<String> bookName = new Book<String>("高等数学");
        Book<String> bookAuthor = new Book<>("同济大学");//后面的<>里面不写类型也可以
        Book<Double> bookPrice = new Book<Double>(25.9);
        Book<Boolean> hasOther = new Book<Boolean>(false);

        System.out.println(bookName.getBookInfo());
        System.out.println(bookAuthor.getBookInfo());
        System.out.println(bookPrice.getBookInfo());
        System.out.println(hasOther.getBookInfo());
    }
}
/*
高等数学
同济大学
25.9
false
*/

常规用法

定义时声明多个类型

class Demo01<T1,T2>{}

T1和T2为可定义的类型

声明数组类型

public class Array <T>{
    private T[] arr;     //定义泛型数组
    public T[] getArr(){
        return arr;
    }
    public void setArr(T[] arr){
        this.arr=arr;
    }

    public static void main(String[] args) {
        Array<String> demo = new Array<>();
        String value[]={"你好","十二月","你好呀"};
        demo.setArr(value);
        String arr[]= demo.getArr();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

常用的被泛型化的集合类

集合类 泛型定义
ArrayList ArrayList<>
HashMap HashMap<K,V>
HashSet HashSet<>

高级用法

限制泛型可用类型

class 类名称<T extends anyClass>

anyClass指某类接口或类

使用泛型限制后,泛型类的类型必须实现或继承anyClass这个接口或类。在进行泛型限制时必须使用extends关键字

使用类型通配符

主要作用是在创建一个泛型类对象时限制这个泛型类的类型实现或继承某个接口或类的子类

要声明一个对象可以使用"?"通配符来表示,同时使用extends来对泛型进行限制

泛型类名称<? extends List> a=null;
表示类型未知,使用时,可单独实例化 ```java A a=null; a =new A(); a =new A(); ``` 还可以将实例放在方法的参数中 ```java public void doSomething(A a){} ``` 注:若使用A这样的对象,则默认将A指定为实例化Object及以下的子类类型

泛型类型限制除了可以向下限制,也可以向上限制,在定义时加上super即可

A<? super List> a=null;

定义后,a只接受List接口或上层父类类型

继承泛型类与实现泛型接口

定义为泛型类的接口也可以被继承和实现

class A<T1>{}
class B<T1,T2,T3> extends A<T1>{}

实现接口

interface A<T1>{}
class B<T1,T2,T3> implements A<T1>{}

泛型总结

  1. 泛型的类型参数只能是类类型,而不能是普通类型,例如A《int》(这里的书名号是尖括号)就是错误的
  2. 类型个数可以是多个
  3. 可用extends限制泛型的类型
  4. 可用通配符限制泛型的类型
posted @ 2021-12-13 17:43  valder-  阅读(61)  评论(0)    收藏  举报