Java泛型方法通过限定类型参数T为X或其子类,使返回值T自然成为X的子类;不能用super限定返回值,多边界限定支持类与接口组合。

Java 中泛型方法本身不直接“限制返回值必须是某类型的子类”,而是通过类型参数的上界(upper bound)来约束**类型参数本身**,从而间接确保方法返回的值属于该上界类型或其子类。关键在于:返回值类型由泛型参数 T 决定,而 T 通过 extends 被限定为某个类或接口的子类型。
用 extends 限定泛型参数,让返回值自然满足子类要求
泛型方法声明时,在类型参数后加 extends X,表示该参数只能是 X 或其子类。此时,若方法返回类型是 T,那返回值就一定是 X 的子类实例(或 X 本身)。
-
public→ 返回值类型是T getNumber() { ... } T,而T必须是Number的子类(如Integer、Double),所以返回值必然是Number的子类。 - 不能写成
public Number getNumber()—— 这不是泛型方法,丢失了具体子类型信息,也无法保证返回的是“子类”而非Number本身。
常见写法示例
以下都是合法且典型的用法:
-
限定为具体类的子类:
publicT openStream(String path) { return (T) new FileInputStream(path); }
调用时可指定或,返回值就是对应子类实例。 -
限定为接口实现类:
public> T findMax(T a, T b) { return a.compareTo(b) > 0 ? a : b; }
返回值T必须实现Comparable,比如String、LocalDate等。 -
多边界限定(类 + 接口):
public> T parseAndCompare(String s) { ... }
此时T必须是Number的子类,同时实现Comparable(如BigDecimal)。
注意:不能用 super 限定返回值为子类
? super T 是下界通配符,用于**入参**(接收更宽泛的类型),它不适用于声明返回值类型。想让返回值是某类型的子类,唯一可靠方式就是用 声明类型参数,并将返回类型设为 T。
调用时类型由实参或显式指定决定
编译器通常能根据上下文推断 T;也可显式指定以确保类型安全:
Integer i = util.getNumber(); -
FileInputStream fs = openStream("a.txt");(若方法签名已限定T extends InputStream,且返回值赋给FileInputStream变量,则推断T = FileInputStream)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











