Java泛型

51 阅读2分钟

众所周知,java中可以使用泛型,在声明类的方法的时候可以不必指定类型,而是使用泛型代替,当作为泛型方法时,Java会根据你传入的类型,替换泛型为传入的类型,泛型类也差不多。

泛型方法:

 public class Test {
     public static <T> T getprint(T s) {return s;}
  
     public static void main(String[] args) {
         System.out.println(getprint("abc"));
         System.out.println(getprint(123));
         ArrayList<String> list=new ArrayList<>();
         list.add("aaa");
         list.add("bbb");
         System.out.println(getprint(list));
     }
 }

泛型类:

 public class Study {
     public static void main(String[] args) {
         Test<String> test01=new Test<String>("abc");
         System.out.println(test01.getKey());
         //
         Test<Integer> test02=new Test<Integer>(123);
         System.out.println(test02.getKey());
         //
         Test<ArrayList<String>> test03=new Test<ArrayList<String>>(new ArrayList<>(Arrays.asList("aaa", "bbb")));
         System.out.println(test03.getKey());
     }
 }
  
 class Test<T> {
     private T key;
  
     public Test(T key) {this.key = key;}
  
     public T getKey() {return key;}
  
     public void setKey(T key) {this.key = key;}
 }

泛型作用范围:

当类上声明泛型T同时方法也声明泛型T,方法的泛型和类泛型是隔离的即使是相同T。

 public class Stdudy<T> {
     /*
      * 方法前无<T>,泛型类中的方法,其中的T类型与泛型类的T类型一致。
      */
     public T gogo(T t) {return t;}
  
     /*
      * 方法前有<T>,泛型方法,其中的T类型是独立的,不受泛型类的T类型约束
      */
     public <T> T go(T t) {
         return t;
     }
  
     public static void main(String[] args) {
         String s = "abc";
         new Stdudy().go(s);
     }
 }

此外还有一种?符号,这里他不是三目运算符

其中?是什么呢,?是泛型通配符,而不是泛型

此外泛型还可以指定范围:

extends:表示类型上界。例:A extends B,表示类型必须是B或B的子类

super:表示类型下界。例:A super B,表示类型必须是B或B的父类

表示初始化值上限值是小于等于Number,下限值是无穷小的子类 表示初始化值上限值是小于等于Object,下限值是大于等于Integer 表示无限大

List list=new ArrayList<>();

这个list在插入值时,这个例子中插入值必须小于等于Number,即必须是Number或者他的子类。

但是List<?> list=new ArrayList();无法添加

当你声明 List<?> 时,你声明了一个可以持有任何类型对象的列表。但是,由于类型擦除,你不能向这样的列表中添加任何对象,因为编译器无法确定添加的对象类型是否安全。你可以从中读取对象,但必须进行类型检查或转换。

image-20240904213012518

“?”可以独立用于参数范围的限定:

 public class Test {
     public static void go(List<? extends Number> dest){
         System.out.println(dest);
     }
     public static void main(String[] args) {
         go(new ArrayList<>(Arrays.asList(111,222)));
     }
 }

“?”通配符也可以和泛型配合:

     public static <T> void go(List<? extends T> dest){
         System.out.println(dest);
     }