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的父类
3 泛型接口
与泛型类的用法基本相同,常用于数据类型的生产工厂接口中
定义泛型接口
//泛型接口
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 泛型字母的含义