Java|java泛型generics泛型类的用法

Java|java泛型generics泛型类的用法

/**
* 测试generics泛型
* generic通用的 generics泛型
*/
public class Test1<T> {
//泛型在类名后使用<>表示 泛型字符可以使用任意标识符 公认T(type)表示普通java类 E(element)表示容器中的元素
// K(key)表示Map中的键key V(value)表示值 N(number)表示数值类型 ?表示不确定的JAVA类型
//可以同时使用多个泛型字符 用隔开 <xxxx>
private T flag;
//使用T来泛指想要设定的 flag的类型 比如想用T来指代String 则类内所有T都指代String 在外部实际调用Test1时可以通过<>改变T的指代类型 同一套Test1可以实现多种类型的应用 将同一套模式泛用化
public void setFlag(T flag){
//将T类型的flag赋值给this.flag T的类型随外部调用时设定而变化
this.flag = flag;

public T getFlag(){
//凡涉及到flag 的类型都统一为T 避免了类型错误 省去了强制转型的操作
return this.flag;

//    T t = new T(); 报错 泛型字符不能用于创建对象

class Test2{
public static void main(String[
args) {
Test1<String> str = new Test1<>();
//实际使用时通过设定<>内的具体类型来使用Test1类 设定为String后 原类内所有T都替换为String 即将flag的类型变为String
//格式  类名<想设定的类型> 引用变量名 = new 类名<>()     new后的<>为空 统一通过等号左侧来定义
str.setFlag(\"这里的参数要求变为了String类型 将字符串传参进set方法中赋值给 String类型的flag\");
System.out.println(str.getFlag()+\" 这里的get方法返回值同样变为了字符串\");
Test1<Integer> i1 = new Test1<>();
//当T设定为Integer后 Test1又变为了使用Integer类型的类 这个Test1和上面的Test1<String>是两个类 在编译阶段将Test1分成了两个类 实际JVM虚拟机运行时没有泛型的概念
i1.setFlag(100);
//set方法的参数要求变为了Integer类型 输入int的100会在编译阶段转换为 Integer.valueOf(100)
System.out.println(i1.getFlag());
//同样get方法的返回值类型也变为了Integer 在打印时会默认调用Integer重写的.toString 方法 打印Integer对象.value
Test1 o1 = new Test1();
//当不写<>时 T指代Object类 new后面也不写<>
//        Test1<int> i = new Test1<>();  报错  基本数据类型不能用于泛型 泛型只能是类/接口 基本数据类型需要用包装类代替


interface Test3<T>{
//定义泛型接口
T getNumber(T number);
//接口的抽象方法 默认public abstract

class Test3Impl implements Test3<Integer>{
//实现泛型接口 将T设定为Integer
@Override
public Integer getNumber(Integer number) {
//需要实现的方法也一并变为Integer类型
return number;

public static void main(String[
args) {
Test3Impl i3 = new Test3Impl();
//正常调用类
System.out.println(i3.getNumber(3));
Test3 o3 = new Test3Impl();
//通过接口引用变量
Object o = o3.getNumber(3);
System.out.println(o);
//引用类型Test3没有<>设定类型 T指代Object类 o3.getNumber()要求传参为Object类型
// o3为Test3编译类型 运行时类型为Test3Impl 此时如果.getNumber()内参数不是Integer的实例会报类型转换异常
// 数字3自动封装为包装类Integer传入.getNumber()中 执行后返回Integer对象 但由于编译类型o3限制 返回对象自动转换为Object 赋值给o
//打印时编译类型o变为运行时类型Integer调用重写的.toString打印.value 结果为3