大数据知识体系
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
  • JVM

    • JVM 架构
    • JVM 类加载机制
    • JVM 运行时数据区
    • JVM 垃圾回收机制
    • JVM 性能监控与调优
    • JVM 常见错误
  • Java

    • Java基础

      • Java 基础知识
      • Java 基础 - 枚举类
      • Java 基础 - 异常处理
      • Java 基础 - 泛型
        • 为什么使用泛型
        • 语法
          • 泛型类
          • 泛型接口
          • 泛型方法
        • 泛型通配符
          • 使用原则
      • Java 基础 - 反射
      • Java 基础 - 代理模式
      • Java 基础 - 注解
    • Java集合

    • Java并发编程

    • Java 开发规范
  • Scala

    • Scala 概述
  • Python

    • Numpy

      • 初识 Numpy
      • ndarray 的创建方式
      • NumPy 的数据类型
      • NumPy 数组计算
      • 拷贝
      • 索引和切片
      • 数学和统计方法
      • 数组形状变换
      • 通用函数
      • 排序
      • 搜索和计数
      • 线性代数
      • 伪随机数生成
      • 广播
      • 文件输入和输出
    • Pandas

      • 初识 Pandas
      • 认识 Series 和 DataFrame
      • Series 和 DataFrame 增删改查
      • Index对象增删改查
      • 普通列和行Index相互转化
      • 快速查看整体信息
      • 数值运算
      • 合并数据集
      • 数值统计与聚合
      • 分组聚合
      • 分类类型
      • 排序和排名
      • 时间序列
      • 文件输入与输出
      • 缺失值处理
      • 字符串处理
      • pandas sql
      • 其它
  • 语言基础
  • Java
  • Java基础
Will
2022-04-26
目录

Java 基础 - 泛型

# 为什么使用泛型

泛型其实就是将类型参数化,从而提高参数类型的表达能力。泛型可以使用在类、接口和方法上,分别被称为泛型类、泛型接口和泛型方法,使用泛型的优势有:

  1. 泛型可以使得程序在编译期间就发现类型匹配问题,而不是在运行期间发现问题。
  2. 泛型可以明确特定对象实例化时的类型信息,避免不必要的类型转换。
  3. 泛型可以提高代码重用性。

# 语法

泛型的标识是在一对尖括号“<>”中包含类型参数,其中的类型参数可以有一个或多个,如:<T>、<T, U>、<K, V>。从语法上来说,类型参数可以是任意字符。但是从开发规范的角度来讲,一般都是采用简短的大写字母来表示:

  1. 用E表示集合元素;
  2. K和V分别表示键和值;
  3. T可以表示任意类型,如果有多个任意类型时,可以使用和T相邻的字母,如:U、S。

# 泛型类

class Result<T> {
    private T data;

    public Result() {
    }

    public Result(T data) {
    }
}
1
2
3
4
5
6
7
8
9

# 泛型接口

interface Result<T> {

    public void test1(T data);

    public T test2();
}
1
2
3
4
5
6

# 泛型方法

class Result {
    public <K, V> V getObject(K key, V value) {
        // pass
        return value;
    }
}
1
2
3
4
5
6

在getObject方法签名中从左往右依次解释:

  1. 先出现的<K, V>表示该方法中允许使用两个类型参数,分别是K和V。
  2. 接下来出现的V表示该方法的返回类型为V。
  3. (K key, V value)表示该方法有两个参数key和value,参数类型分别是K和V。

# 泛型通配符

泛型的表达能力是非常强的,在某些场景下,如果需要限定一个类型范围,而不是某个具体类型的时候,就需要使用类型限定符或类型通配符。类型限定符可以归结为下面几种类型:

  1. <?>,表示无限制通配符。
  2. <T extends BoundingType>,表示 T 只能是 BoundingType本身或它的子类。
  3. <? extends BoundingType>,表示限定的类型只能是BoundingType本身或它的子类。
  4. <T extends BoundingTypeA & BoundingTypeB & BoundingTypeC>,一个类型变量有多个限定,但是由于 Java 单继承的特点,所以只能有一个限定符是类,二其它限定符必须是接口,且如果有类出现的话,类必须是出现在第一个位置的。在表达式 <T extends BoundingTypeA & BoundingTypeB & BoundingTypeC>中,BoundingTypeA必须是类或接口, BoundingTypeB和BoundingTypeC只能是接口。
  5. <? super BoundingType>表示限定的类型只能是BoundingType本身或它的父类。

提示

<T extends BoundingType> 和 <? extends BoundingType> 有什么区别?

  1. <T extends BoundingType>用于定义类型参数,它声明了一个类型参数 T,可以放在泛型类的类名后面或泛型方法的返回值前面。
  2. <? extends BoundingType>用于实例化泛型变量中的类型参数,只是具体类型是未知的,放在方法的泛型参数中。
public class Test<T extends Number> {
    public static void main(String[] args) throws Exception {

        test(new Test<A>());
    }

    public static <T extends Number> void test(Test<? extends Number> a) {
    }
}

class A extends Number {
    @Override
    public int intValue() {
        return 0;
    }

    @Override
    public long longValue() {
        return 0;
    }

    @Override
    public float floatValue() {
        return 0;
    }

    @Override
    public double doubleValue() {
        return 0;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 使用原则

通配符的规则整体上可以分为 extends 和 super 两类,具体的使用原则是:

  1. 如果参数化的类型是生产者,则使用 <T extends BoundingType>。
  2. 如果参数化的类型是消费者,则使用 <T super BoundingType>。
上次更新: 2023/11/01, 03:11:44

← Java 基础 - 异常处理 Java 基础 - 反射→

Theme by Vdoing | Copyright © 2022-2023 Will 蜀ICP备2022002285号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式