Java 泛型

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


泛型类

复制代码
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{
    private T key;

    public Generic(T key) {
        this.key = key;
    }

    public T getKey(){
        return key;
    }
}

泛型接口

复制代码
public interface Generator<T> {
    public T next();
}

// 实现泛型接口时,可以传入或者不传实际类型:
public class FruitGenerator<T> implements Generator<T>
public class FruitGenerator implements Generator<String>

泛型方法

复制代码
// 只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法
// 此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
public <T> T genericMethod(Class<T> tClass) {
        T instance = tClass.newInstance();
        return instance;
}
  • 静态方法要使用泛型的话,必须将静态方法也定义成泛型方法

    public class StaticGenerator {
    public static void show(T 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<String>\[\] ls = new ArrayList10;

3,无法对泛型代码直接使用 instanceof 关键字,而使用通配符?是可以的。

  • ❌ list instanceof ArrayList<Integer>
  • ✅ list instanceof ArrayList<?>

4,注意两种继承情况
① 第一种

复制代码
public void showKeyValue(Generic<Number> obj){
    Log.d("泛型测试","key value is " + obj.getKey());
}

Generic<Integer> gInteger = new Generic<Integer>(123);
Generic<Number> gNumber = new Generic<Number>(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<T> {
    public void show_1(T t) {
        System.out.println(t.toString());
    }
}

public static void main(String[] args) {
    Apple apple = new Apple();
    GenerateTest<Fruit> generateTest = new GenerateTest<Fruit>();
    //apple是Fruit的子类,所以这里可以
    [✅]generateTest.show_1(apple);
}    
相关推荐
淡漠的蓝精灵9 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他
乌暮10 小时前
请求进门先安检:Spring 拦截器与统一功能实战指南
java·开发语言·后端·学习·spring
学长毕设10 小时前
基于SpringBoot的烘焙商品商品系统-附源码
java·spring boot·后端
এ慕ོ冬℘゜10 小时前
JS 事件循环、宏任务微任务:单线程底层原理 + 执行顺序
开发语言·javascript·ecmascript
其实防守也摸鱼10 小时前
Chrome 扩展安全攻防实录:从攻击面到防御实践
开发语言·前端·网络·chrome·安全·web安全·php
web打印社区10 小时前
Lodop排障总纲-常见报错一张表
开发语言·前端·javascript·chrome·websocket
金銀銅鐵11 小时前
[Java] 用纯 Swing 做一个《論語·學而》阅读器
java·ai编程·交互设计
艾伦_耶格宇11 小时前
【kubernetes - 1.28版本】-11 K8S核心组件
java·容器·kubernetes
Dxy123931021611 小时前
JS AES加密详解
开发语言·javascript·ecmascript
2301_7807896612 小时前
深度伪造即服务:新型网络诈骗的“完美面具”与识别之道
java·网络·ddos