• Java 泛型


     

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


    泛型类

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

    泛型接口

    1. public interface Generator<T> {
    2.     public T next();
    3. }
    4. // 实现泛型接口时,可以传入或者不传实际类型:
    5. public class FruitGenerator<T> implements Generator<T>
    6. public class FruitGenerator implements Generator<String>

    泛型方法

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

    二,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,注意两种继承情况
    ① 第一种
    1. public void showKeyValue(Generic<Number> obj){
    2.     Log.d("泛型测试","key value is " + obj.getKey());
    3. }
    4. Generic<Integer> gInteger = new Generic<Integer>(123);
    5. Generic<Number> gNumber = new Generic<Number>(456);
    6. [✅] showKeyValue(gNumber);
    7. [❌] showKeyValue(gInteger); //编译报错
    ② 第二种
    1. class Fruit {
    2.     @Override
    3.     public String toString() {
    4.         return "fruit";
    5.     }
    6. }
    7. class Apple extends Fruit {
    8.     @Override
    9.     public String toString() {
    10.         return "apple";
    11.     }
    12. }
    13. class GenerateTest {
    14.     public void show_1(T t) {
    15.         System.out.println(t.toString());
    16.     }
    17. }
    18. public static void main(String[] args) {
    19.     Apple apple = new Apple();
    20.     GenerateTest<Fruit> generateTest = new GenerateTest<Fruit>();
    21.     //apple是Fruit的子类,所以这里可以
    22.     [✅]generateTest.show_1(apple);
    23. }    
  • 相关阅读:
    天童美语育儿书籍推荐《愿你慢慢长大》
    SpringSecurity学习笔记(一)springSecurity的整体架构
    移动端携程网首页flex布局完整制做(详细代码版)含footer部分
    php基于PHP的汉服文化交流平台毕业设计源码240903
    Java运算符和表达式
    基于 MinIO 部署单实例 Databend | 新手篇(1)
    NB!移动端APP自动化安全分析平台
    重读VDSR
    uni-app —— 下拉刷新 & 上拉加载
    困惑了小白很久的问题——为什么Python列表和字典前面会加星号(**)?
  • 原文地址:https://blog.csdn.net/jiezheee/article/details/139633545