如何定义接收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
相关产品推荐
相关产品推荐

