You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义接收T类型及继承T的S类型参数的Java方法

你的泛型方法写法完全正确!

你写的这个方法声明public static <T, S extends T> void testMethod(T t, S s)完美实现了你的需求——让第二个参数的类型S要么是第一个参数类型T的子类,要么和T是同一类型。

我来给你拆解一下这个声明的核心逻辑:

  • <T, S extends T>是泛型类型参数的定义:先声明基础类型T,再用extends关键字约束S必须是T的子类型(注意:Java泛型里的extends既涵盖类的继承关系,也包括接口的实现关系)。
  • 方法参数T t和S s对应这两个受约束的类型,编译器会在编译阶段自动检查类型是否符合要求,从根源上保证类型安全。

举几个实际调用的例子帮你更直观地理解:

// 示例1:T为Number,S为Integer(Integer继承自Number)
Number myNum = new Double(3.14);
Integer myInt = 100;
testMethod(myNum, myInt); // 完全合法,符合约束

// 示例2:S和T是同一类型(String)
testMethod("Hello", "Stack Overflow"); // 合法,因为类型可以是自身

// 示例3:不符合约束的情况(编译直接报错)
String str = "test";
Integer num = 5;
testMethod(str, num); // 编译器报错:Integer不是String的子类型,违反约束

另外,Java编译器大多能自动推断出T和S的具体类型,不需要你手动指定。当然你也可以显式指定类型,让代码更清晰:

testMethod<Number, Integer>(myNum, myInt);

这种泛型约束在需要保证参数之间的类型层级关系时非常实用,能帮你避免很多潜在的运行时类型转换错误。

内容的提问来源于stack exchange,提问作者Hedayat Mahdipour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:55:26