java中extends限制泛型上限的核心是类型约束,即t只能是某类或接口及其子类/实现类,从而安全调用边界方法;可应用于类、接口、方法及通配符,如box、 sum()、list

Java 中用 extends 限制泛型类型上限,核心是告诉编译器“这个类型只能是某个类或接口,或者它的子类/实现类”。这不是传统意义上的继承,而是一种类型约束,目的是在保持泛型灵活性的同时,确保能安全调用边界类型定义的方法。
在泛型类或接口中声明上界
直接在类型参数后加 extends 边界类型,边界可以是具体类(如 Number)或接口(如 Comparable):
-
class Box
{ ... } → T 只能是 Number 或 Integer、Double 等子类 -
interface Listable
&Serializable> { ... } → T 必须同时实现 Comparable 和 Serializable,类必须写在前面(如 T extends Animal & Runnable 合法,T extends Runnable & Animal 报错)
在泛型方法中限定入参类型
方法级别也可独立设限,不影响所在类的泛型声明:
- public double sum(U[] nums) { ... } → 调用时传入 Integer[] 或 Double[] 都合法,但 String[] 会编译失败
- 此时可在方法体内安全调用 u.doubleValue(),因为所有 U 都保证有该方法(来自 Number)
用通配符 ? extends 声明只读集合
适用于变量声明或方法参数,强调“能取不能放”:
- List extends Number> list = new ArrayList
(); - 可安全执行 Number n = list.get(0);(返回值向上转型为 Number)
- 但 list.add(new Integer(1)); 编译不通过——编译器不知道实际是 Integer 还是 Double,为类型安全禁止写入(null 除外)
为什么 extends 能调用边界方法
约束生效后,编译器就知道泛型实例一定具备边界类型声明的行为:
- 比如
> ,就能在方法里放心写 t.compareTo(another) - 再如 Box
,内部可直接调用 t.intValue() 或 t.doubleValue() - 若未加 extends,这些方法调用会报错,因为 Object 没有这些方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











