Java:为何无界泛型返回值可作为指定接口类型的参数编译通过?
泛型编译通过原因解答
这段代码能正常编译是Java泛型方法的上下文类型推断机制的正常表现,具体逻辑如下:
- 你定义的
test2()是无界泛型方法,声明为<V> V test2(),类型参数V的默认上界是Object,所有引用类型都满足V的约束要求。 - 调用
test(test2())时,编译器会根据test()方法的入参要求(接收IDummy类型参数),自动推断test2()的类型参数V为IDummy类型,IDummy是合法的引用类型,完全符合V的上界约束,不存在类型冲突。 test2()返回值为null,null可以赋值给任意引用类型,和推断出的V(IDummy)类型完全兼容,不会触发编译错误。
验证方式
你可以通过显式指定泛型参数的写法复现编译器的推断逻辑:
// 完全等价于编译器自动推断的结果,可正常编译 test(Main.<IDummy>test2()); // 显式指定V为String类型,和IDummy不兼容,编译报错 test(Main.<String>test2());
扩展说明
如果修改test2()的返回逻辑为非null值,例如:
private static <V> V test2(){ return (V) new Object(); }
编译阶段仍然可以通过,但运行时会抛出ClassCastException,因为实际返回的Object无法转换为推断出的IDummy类型。你当前返回的是null,运行也不会抛出异常。
内容的提问来源于stack exchange,提问作者Just_LeonS
相关产品推荐
相关产品推荐

