欢迎光临散文网 会员登陆 & 注册

java泛型generics泛型类的用法

2022-07-16 08:40 作者:虚云幻仙  | 我要投稿

/**
* 测试generics泛型
* generic通用的 generics泛型
*/

public class Test1<T> {
   //泛型在类名后使用<>表示 泛型字符可以使用任意标识符 公认T(type)表示普通java类 E(element)表示容器中的元素
   // K(key)表示Map中的键key V(value)表示值 N(number)表示数值类型 ?表示不确定的JAVA类型
   //可以同时使用多个泛型字符 用,隔开 <x,x,x,x>

   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


       Test3<Integer> i4 = new Test3Impl();
       //将接口设定为与实现类一致的类型 免去转换
       System.out.println(i4.getNumber(4));
   }
}

java泛型generics泛型类的用法的评论 (共 条)

分享到微博请遵守国家法律