如何让泛型方法返回对应泛型子类的value()方法类型?
泛型方法返回类型匹配解决方案
你有如下抽象类及实现类:
abstract class A<S> { abstract S value(); } class B extends A<Integer> { @Override Integer value() { return 10; } } class C extends A<String> { @Override String value() { return "Hello"; } }
想要定义getValue方法,使得调用getValue(new B())时返回Integer类型,调用getValue(new C())时返回String类型,之前尝试的写法无法正确访问A的泛型参数S,正确实现方式有两种:
方式一:直接绑定泛型参数S
<S> S getValue(A<S> object) { return object.value(); }
方式二:保留T泛型并关联S
<S, T extends A<S>> S getValue(T object) { return object.value(); }
说明
之前U extends A.S的写法错误,因为S是A的泛型参数,不是内部类或成员,不能通过A.S访问。上述两种写法都明确了泛型S和A的关联,编译器可以根据传入的具体实现类(B或C)自动推断出返回类型,调用时无需额外指定泛型,就能得到正确的返回值类型:
Integer num = getValue(new B()); // 自动推断返回Integer String str = getValue(new C()); // 自动推断返回String
内容的提问来源于stack exchange,提问作者user3629072
相关产品推荐
相关产品推荐

