Java 泛型

Java 泛型

码农世界 2024-06-14 后端 97 次浏览 0个评论
 

一,3种泛型方式:泛型类、泛型接口、泛型方法


泛型类

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic{
    private T key;
    public Generic(T key) {
        this.key = key;
    }
    public T getKey(){
        return key;
    }
}

泛型接口

public interface Generator {
    public T next();
}
// 实现泛型接口时,可以传入或者不传实际类型:
public class FruitGenerator implements Generator
public class FruitGenerator implements Generator

泛型方法

// 只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法
// 此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
public  T genericMethod(Class tClass) {
        T instance = tClass.newInstance();
        return instance;
}
  • 静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 
    public class StaticGenerator {
        public static  void show(T t){
        }
    }
    • 泛型方法中添加上下边界的时候,必须在权限声明与返回值之间的上添加上下边界,即在泛型声明的时候添加。
      // 编译器会报错
      public  T showKeyName(Generic container)
      public  T showKeyName(Generic container){
          System.out.println("container key :" + container.getKey());
          T test = container.getKey();
          return test;
      }
                         

      二,Tips


      1,类型擦除:泛型类型只在编译阶段有效。 2,不能创建一个确切类型的泛型数组,而使用通配符?是可以的。
      • [❌] List[] ls = new ArrayList[10]
      • [✅] List[] ls = new ArrayList[10];
      • [✅] List[] ls = new ArrayList[10]; 3,无法对泛型代码直接使用 instanceof 关键字,而使用通配符?是可以的。
        • [❌] list   instanceof   ArrayList
        • [✅]  list instanceof ArrayList 4,注意两种继承情况 ① 第一种
          public void showKeyValue(Generic obj){
              Log.d("泛型测试","key value is " + obj.getKey());
          }
          Generic gInteger = new Generic(123);
          Generic gNumber = new Generic(456);
          [✅] showKeyValue(gNumber);
          [❌] showKeyValue(gInteger); //编译报错
          ② 第二种
          class Fruit {
              @Override
              public String toString() {
                  return "fruit";
              }
          }
          class Apple extends Fruit {
              @Override
              public String toString() {
                  return "apple";
              }
          }
          class GenerateTest {
              public void show_1(T t) {
                  System.out.println(t.toString());
              }
          }
          public static void main(String[] args) {
              Apple apple = new Apple();
              GenerateTest generateTest = new GenerateTest();
              //apple是Fruit的子类,所以这里可以
              [✅]generateTest.show_1(apple);
          }    

转载请注明来自码农世界,本文标题:《Java 泛型》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,97人围观)参与讨论

还没有评论,来说两句吧...

Top