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);
}    
相关推荐
devilnumber6 小时前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
asdfg12589638 小时前
JavaBean是什么?怎么理解?有什么用途?
java·开发语言
dsyyyyy11018 小时前
JavaScript变量
开发语言·javascript·ecmascript
z落落9 小时前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
allway29 小时前
How to Echo Multiline to a File in Bash [3 Methods]
开发语言·chrome·bash
weixin_462446239 小时前
手把手教你用 Bash 脚本自动更新 /etc/hosts —— 自动绑定网卡 IP 与节点名
开发语言·tcp/ip·bash
一个梦醒了9 小时前
安装git bash选项推荐
开发语言·git·bash
摇滚侠9 小时前
SpringMVC 入门到实战 文件上传 75-77
java·后端·spring·maven·intellij-idea
GIS数据转换器10 小时前
城市排水生命线安全运行监测平台深度解析
java·运维·人工智能·python·安全·数据挖掘·无人机
ct97810 小时前
React 状态管理方案深度对比
开发语言·前端·react