JAVA泛型

1 简介

泛型:让数据类型变得参数化

定义泛型时,对应的数据类型是不确定的。泛型方法被调用时,会指定具体类型。

核心目标:解决容器类型在编译时安全检查的问题。

泛型分为三类:泛型类;泛型接口;泛型方法

2 泛型类

注意:泛型的参数不支持基本类型;

          泛型相关的信息不会进入到运行时阶段(在编译的时候就会用具体的数据类型替换掉泛型定义)

定义泛型类

import lombok.Data;

@Data
public class GenericClassExample<T> {
    private T member;
    public GenericClassExample(T member)
    {
        this.member = member;
    }
    public T handleSomething(T target)
    {
        return target;
    }
}

使用泛型类:

public class GenericDemo {
    public static void main(String[] args) {
        GenericClassExample<String> stringExample = new GenericClassExample<String>("abc");
        GenericClassExample<Integer> integerExample = new GenericClassExample<Integer>(123);
        System.out.println(stringExample.getMember().getClass());
        System.out.println(integerExample.getMember().getClass());
    }
}

在泛型里面使用具有继承关系的类  

泛型不接受继承关系,比如已经指定了泛型是Integer,Number是Integer的父类,后面调用时指定的类型是Number,但是不能编译通过

方法:

1.使用通配符?,但是会使得泛型的类型检查失去意义

但是使用这种方式,String类型也可以被传入到函数中,就会导致运行错误

2.给泛型加入上边界:? extends E

指定传入的泛型的数据类型必须是继承至E的

3.给泛型加入下边界: ? super E

指定传入的泛型的数据类型必须是E的父类

泛型接口

与泛型类的用法基本相同,常用于数据类型的生产工厂接口中

定义泛型接口

//泛型接口
public interface GenericIFactory<T,N> {
    T nextObject();
    N nextNumber();
}

定义实现类

public class RobotFactory implements GenericIFactory<String,Integer> {
    private String stringRobot[] = new String[]{"Hello","Hi"};
    private Integer integerRobot[] = new Integer[]{111,000};
    @Override
    public String nextObject() {
        Random random = new Random();
        return stringRobot[random.nextInt(2)];
    }
    @Override
    public Integer nextNumber() {
        Random random = new Random();
        return integerRobot[random.nextInt(2)];
    }
}

使用

 public static void main(String[] args) {
        RobotFactory factory = new RobotFactory();
        System.out.println(factory.nextObject()+" " +factory.nextNumber());
    }

可以定义泛型类来继承泛型接口

public class RobotFactory<T,N> implements GenericIFactory<T,N> {
   
    @Override
    public T nextObject() {
        return null;
    }
    @Override
    public N nextNumber() {
        return null;
    }
}

4 泛型方法

既能用在泛型类、泛型接口里,也能用在普通类或者接口里

定义一个泛型方法在我们之前定义的泛型类中

//泛型类
@Data
public class GenericClassExample<T> {
    private T member;
    public GenericClassExample(T member)
    {
        this.member = member;
    }
    public T handleSomething(T target)
    {
        return target;
    }
    //泛型函数
    public static<E> void printArray(E[] inputArray)
    {
        for(E element:inputArray)
        {
            System.out.printf("%s ",element);
        }
        System.out.println();
    }

}

使用:泛型函数的数据类型可以和泛型类的数据类型不一致

public class GenericDemo {
    public static void main(String[] args) {
        //使用泛型函数
        GenericClassExample<String> example = new GenericClassExample<String>("abc");
        Integer[] integers = {1,2,3,4,5,6};
        Double[] doubles={1.1,2.2,3.3,4.4,5.5};
        Character[] characters={'A','B','C'};
        example.printArray(integers);
        example.printArray(doubles);
        example.printArray(characters);
    }
}

5 泛型字母的含义

 

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页