Java中如何让方法泛型返回类型受两个参数泛型的最低公共类型约束?
在Java中实现泛型返回类型为两个参数的最低公共超类型的编译时约束
当然可以实现这种编译时约束!我们可以通过泛型的上下界约束让编译器自动推断并强制返回类型为两个输入参数的最低公共超类型,具体思路是给返回类型参数R设置约束,让两个输入参数的类型T和U都兼容R。
修改后的方法实现
class Scratch { // 核心约束:T和U都必须是R的子类型,编译器会自动推断最具体的R(即最低公共超类型) static <T extends R, U extends R, R> R getLowestCommon(T t, U u) { // 可根据实际需求实现逻辑,此处仅做示例返回null return null; } public static void main(String[] args) { Object o = getLowestCommon("", 1); // 正确:String和Integer的最低公共超类型是Object CharSequence s = getLowestCommon("", new StringBuilder()); // 正确:String和StringBuilder都实现了CharSequence Number n = getLowestCommon(1L, 2D); // 正确:Long和Double的最低公共超类型是Number Collection<Integer> c = getLowestCommon(new ArrayList<Integer>(), new HashSet<Integer>()); // 正确:ArrayList和HashSet的最低公共超类型是Collection // 编译错误!因为HashSet<Integer>不是List<Integer>的子类型,不满足U extends R的约束 List<Integer> l = getLowestCommon(new ArrayList<Integer>(), new HashSet<Integer>()); } }
为什么这个约束能生效?
- 我们给泛型参数
T和U添加了extends R的约束,意味着所有传入的T和U类型都必须是R的子类型。 - 调用方法时,Java编译器会自动推断出满足
T extends R和U extends R的最具体的R类型,也就是两个输入类型的最低公共超类型。 - 如果手动指定不符合要求的R类型(比如最后一行的
List<Integer>),编译器会发现HashSet<Integer>并不继承自List<Integer>,直接抛出编译错误,完美匹配你的需求。
关于交集类型的说明
你提到的交集类型限制在这里并不影响,因为我们没有使用&语法定义交集类型,而是通过双向的上下界约束实现了对公共超类型的推断。这种方式完全符合Java泛型的规范,没有任何语法限制。
内容的提问来源于stack exchange,提问作者clausavram
相关产品推荐
相关产品推荐

