目录
泛型认识
java 中泛型标记符:
E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的 java 类型
好处
1适用于多种数据类型执行相同的代码(代码复用)
2 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)
类泛型使用
接口与类相同
package com.zhang;
import java.util.ArrayList;
import java.util.Random;
/**
* @Description TODO
* @Author 小乌龟
* @Date 2022/2/11 15:22
*/
public class Test {
@org.junit.jupiter.api.Test
void Dome() {
//可以定义不同的类型
Box<Integer> integerBox = new Box<Integer>();
Box<String> stringBox = new Box<String>();
integerBox.add(10);
stringBox.add("String");
integerBox.print("23","24",43);
System.out.println(integerBox.get().toString());
System.out.println("==========");
System.out.println(stringBox.get());
}
}
class Box<T> {
private T t;
public void add(T t) {
this.t = t;
}
// 成员方法
public T get() {
return t;
}
//泛型方法
//方法独立与类而产生变化 泛型方法可变为static
public <E> E getBox(ArrayList<E> list){
return list.get(new Random().nextInt(list.size()));
}
// 泛型方法与可变参数
public <T> void print(T... e){
for (T el:e) {
System.out.println(el);
}
}
}
结果:
定义格式
修饰符 interface接口名<代表泛型的变量> { }
看一下下面的例子,你就知道怎么定义一个泛型接口了:
/**
* 定义一个泛型接口
*/
public interface Test<T> {
public abstract void add(T t);
}
类型通配符
类型通配符一般是使用 ? 代替具体的类型参数。例如 List<?> 在逻辑上是 List<String>,List<Integer> 等所有 List<具体类型实参> 的父类。
public class Test {
public static void getData(List<?> data) {
System.out.println("data :" + data.get(0));
}
@org.junit.jupiter.api.Test
void Dome() {
List<String> name = new ArrayList<String>();
List<Integer> age = new ArrayList<Integer>();
List<Number> number = new ArrayList<Number>();
name.add("icon");
age.add(18);
number.add(314);
getData(name);
getData(age);
getData(number);
}
}
结果:
类型通配符上下限
泛型的上限:
- 格式:
类型名称 <? extends 类 > 对象名称
- 意义:
只能接收该类型及其子类
泛型的下限:
- 格式:
类型名称 <? super 类 > 对象名称
- 意义:
只能接收该类型及其父类型
class Animal{}//父类
class Elephant extends Animal{}//子类
class Tiger extends Animal{}//子类
class BigTiger extends Tiger{}
//使用
ArrayList<? extends Animal> list = new ArrayList<Animal>();
类型擦除