无界表示t为任意引用类型,仅支持object方法;有界限定t为x或其子类,可调用x定义的方法,支持多上界且类上界须居首。

泛型方法中 `
无界 ``:最宽松,但能力有限
写成 `
- 适用于仅需类型占位、不做具体操作的场景,比如简单封装或转发
- 不能在方法体内安全调用 `t.compareTo(...)` 或 `t.size()`,除非先强制转型(失去泛型安全意义)
- 调用时由实参类型自动推断 T,例如传入 `String`,T 就是 `String`;传入 `Integer`,T 就是 `Integer`
有界 ``:限定范围,解锁能力
`
- 若 X 是接口(如 `Comparable
`),则可直接调用 `t.compareTo(...)` - 若 X 是类(如 `Number`),则可调用 `doubleValue()`、`intValue()` 等
- 多个上界用 `&` 连接,如 `
& Serializable>`,表示 T 必须同时满足两者 - 注意:类上界必须放在最前,且最多只能有一个,如 `
` 合法,` ` 编译失败
为什么不能一边写 `` 一边又在参数里用 `extends T`?
常见误解是把 `
- `
` 是类型参数声明,作用于整个方法签名和方法体 - `? extends T` 是通配符,只用于变量、参数或字段类型,表示“某个 T 的子类型”,它本身不是类型参数,不能用于定义方法体内的逻辑变量
- 你不能写 `static
void f(? extends T t)` —— 语法非法。正确写法是 `static void f(T t)` 或 `static void f(List extends T> list)`
类型参数与实际参数必须严格一致
泛型方法的类型参数 T 在一次调用中是固定且唯一的。比如方法 `static
- 编译器尝试找最小公共上界(如 `String` 和 `Integer` 的 LUB 是 `Serializable & Comparable>`),但若未显式声明该上界,就无法匹配
- 解决办法是显式指定类型实参:`MyClass.
pick(str, num)`,前提是方法签名支持(即 ` `) - 否则应避免跨类型混用,或改用通配符接收更宽泛的输入(如 `List extends Number>`)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











