1.上界

Java 泛型的上界用于限制泛型类型参数必须是某个类型的子类型,通常使用 extends 关键字来表示。下面是一个示例代码,其中 T 的上界是 Comparable<T>,表示 T 必须是实现了 Comparable<T> 接口的类型:

public class Example<T extends Comparable<T>> {private T[] array;public Example(T[] array) {this.array = array;}public T getMax() {T max = array[0];for (T item : array) {if (item.compareTo(max) > 0) {max = item;}}return max;}
}

在上面的代码中,Example 类使用了泛型类型参数 T,并通过 extends 关键字指定了 T 的上界是 Comparable<T>,表示 T 必须是实现了 Comparable<T> 接口的类型。在 getMax 方法中,使用了 T 类型的 compareTo 方法,该方法是 Comparable<T> 接口中定义的方法。

通过使用泛型的上界,我们可以在编译时就检查泛型类型参数的类型是否符合要求,从而提高代码的类型安全性和可读性。同时,也可以在泛型类型参数的使用中,直接调用其上界类型中定义的方法和属性。

在 Java 泛型中,还可以使用多个上界,表示泛型类型参数必须同时是多个类型的子类型,这个特性被称为多重上界(Multiple Bounds)。多重上界使用 `&` 连接多个类型,其中第一个类型必须是一个类或者接口,其他的类型必须是接口。例如:


public class Example<T extends Comparable<T> & Serializable> {//
}

上面的代码中,`T` 的上界是同时实现了 `Comparable<T>` 和 `Serializable` 接口的类型。

需要注意的是,Java 泛型中的上界和下界都是单向限定的,即只能限定泛型类型参数的上界或下界,而不能同时限定。也就是说,我们不能同时使用 `extends` 和 `super` 关键字来限定一个泛型类型参数。

下面是一个例子,其中定义了一个 `print` 方法,使用了上界通配符 `<? extends Number>` 来限定参数类型:

public class Example {public static void print(List<? extends Number> list) {for (Number n : list) {System.out.print(n + " ");}System.out.println();}public static void main(String[] args) {List<Integer> intList = Arrays.asList(1, 2, 3);List<Double> doubleList = Arrays.asList(1.1, 2.2, 3.3);print(intList);     // 输出:1 2 3print(doubleList);  // 输出:1.1 2.2 3.3}
}

在上面的代码中,`print` 方法的参数类型是 `List<? extends Number>`,表示该列表中的元素类型必须是 `Number` 类型或其子类型。这样,我们就可以将 `List<Integer>` 和 `List<Double>` 作为参数传递给该方法,因为它们都是 `Number` 的子类型。

2.下界

Java 泛型的下界用于限制泛型类型参数必须是某个类型的父类型,通常使用 `super` 关键字来表示。

下面是一个示例代码,其中 `T` 的下界是 `Number`,表示 `T` 必须是 `Number` 类型或其父类型:

public class Example<T super Number> {private T value;public Example(T value) {this.value = value;}public void setValue(T value) {this.value = value;}public T getValue() {return value;}
}

在上面的代码中,`Example` 类使用了泛型类型参数 `T`,并通过 `super` 关键字指定了 `T` 的下界是 `Number`,表示 `T` 必须是 `Number` 类型或其父类型。在 `setValue` 方法中,可以将任何类型为 `Number` 的值赋给 `value` 成员变量,包括 `Number`、`Integer`、`Double` 等等。

通过使用泛型的下界,我们可以在编译时就检查泛型类型参数的类型是否符合要求,从而提高代码的类型安全性和可读性。同时,也可以在泛型类型参数的使用中,直接使用其下界类型的方法和属性。

和上界一样,下界也可以和通配符一起使用,例如:

public static void addToList(List<? super Integer> list) {list.add(1);list.add(2);list.add(3);
}public static void main(String[] args) {List<Number> numberList = new ArrayList<>();addToList(numberList);System.out.println(numberList); // 输出:[1, 2, 3]List<Object> objectList = new ArrayList<>();addToList(objectList);System.out.println(objectList); // 输出:[1, 2, 3]
}

上面的代码中,`addToList` 方法的参数类型是 `List<? super Integer>`,表示该列表中的元素类型必须是 `Integer` 的父类型。在方法中,我们可以将 `Integer` 类型的值添加到该列表中。在 `main` 方法中,我们先创建了一个元素类型为 `Number` 的列表和一个元素类型为 `Object` 的列表,然后分别将它们作为参数传递给 `addToList` 方法,并将其输出。可以看到,最终两个列表都包含了元素 `1`、`2`、`3`,说明使用泛型的下界,可以使得方法更加灵活,可以接收更多类型的列表作为参数。

java 泛型的上界和下界相关推荐

  1. java数组的下界,Java泛型_上界extends_下界super

    Java泛型_上界extends_下界super ? 通配符类型 extends T> 表示类型的上界,表示参数化类型的可能是T或是T的子类 super T> 表示类型下界(Java C ...

  2. java泛型的上界和下界_java泛型中的上界(extend)和下界(super)

    泛型中上界和下界的定义 上界 extend Fruit> 下界 super Apple> 上界和下界的特点 上界的list只能get,不能add(确切地说不能add出除null之外的对象, ...

  3. java 上界和下界,Java 泛型之上界下界通配符

    Java 泛型之上界下界通配符 Java教程是为JDK 8编写的.本页描述的示例和实践没有利用后续版本中引入的改进. 通配符和子类型 如 泛型,继承和子类型中所述,泛型类或接口仅仅因为它们的类型之间存 ...

  4. java泛型的上界下界

    java泛型的上界下界的demo. import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; impo ...

  5. Java泛型解惑上界通配符和下界通配符

    <? extends T>:是指 "上界通配符(Upper Bounds Wildcards)" <? super T>:是指 "下界通配符(Lo ...

  6. Java中的上界与下界(? extends/super T)

    ? 通配符类型 <? extends T> 表示类型的上界,? 表示参数化类型的可能是 T 或是 T 的子类 <? super T> 表示类型下界,? 表示参数化类型是此 T ...

  7. 简述泛型的上界和下界?

    有时候希望传入的类型有一个指定的范围,从而可以进行一些特定的操作,这时候就需要通配符了?在Java中常见的通配符主要有以下几种: <?>: 无限制通配符 <? extends E&g ...

  8. java 泛型中的上界(extend)和下界(super)

    1. 泛型中上界和下界的定义 上界 <? extends Fruit> 下界 <? super Apple> 2.上界和下界的特点 上界的list只能get,不能add(确切地 ...

  9. Java泛型三:通配符详解extends super

    在java泛型中,? 表示通配符,代表未知类型,< ? extends Object>表示上边界限定通配符,< ? super Object>表示下边界限定通配符. 通配符 与 ...

最新文章

  1. 用python实现图书管理系统
  2. 下载anaconda时出现“Please make sure you are connected to the internet”警告
  3. 7.JasperReports学习笔记7-applet打印
  4. 前端为什么有的接口明明是成功回调却执行了.catch失败回调_前端知识整理
  5. Qt之问题: Unknown module(s) in QT: multimedia
  6. 【慢慢学算法】:奇偶校验(bitset使用)
  7. 2019小程序没必要做了_2019年什么行业适合做小程序
  8. Linux 服务器性能出问题,排查下这些参数指标
  9. 【老生谈算法】matlab实现免疫算法源码——免疫算法
  10. win7家庭普通版计算机桌面图标,Win7家庭普通版更改桌面图标方案
  11. 确定有限自动机DFA非确定有限自动机NFA
  12. 【线性代数(12)】线性方程组、方程组解的结构
  13. 一个简易Android购物App的开发
  14. Linux (deepin)网络管理详解
  15. boost format使用详解
  16. 关于 电子护照 的基本小常识问答
  17. GoogleChrome与Firefox的那些事
  18. 深度学习笔记:01快速构建一个手写数字识别系统以及张量的概念
  19. 同义词,反义词(antonym,synonym)的英文表达理解
  20. (新手向)零基础探究机器学习Crime_Prediction

热门文章

  1. 如何在 Sublime 文本编辑器中使用终端?
  2. 计算机艺术文化主题名称,文化艺术主题口号三篇
  3. 机器学习F1值的概念
  4. 什么是仿站?仿站有什么优势呢?
  5. 实训项目一:图书信息管理
  6. gitlab修改默认端口
  7. 京东京喜上线微信一级入口,谁最担忧?
  8. A2-1 利用stb_image.h来进行图片的绘制与显示
  9. 苹果ID国外账号怎么注册2023最新方法
  10. 使用PDF编辑器可以将图片转成PDF文档吗?