参数中未使用Java泛型返回类型
在java库中,我遇到了一个方法,该方法使用的是泛型返回类型,在参数中没有以任何方式使用:参数中未使用Java泛型返回类型,java,generics,Java,Generics,在java库中,我遇到了一个方法,该方法使用的是泛型返回类型,在参数中没有以任何方式使用: <T extends ResponseCallBack> T sendData(@Nonnull final OrderIf checkoutOrder, @Nullable final List<NameValueIf> ccParmList) throws Exception; 不同之处在于,您可以将此特殊版本用于方法链接 检查此示例程序: public class MyFo
<T extends ResponseCallBack> T sendData(@Nonnull final OrderIf checkoutOrder, @Nullable final List<NameValueIf> ccParmList) throws Exception;
不同之处在于,您可以将此特殊版本用于方法链接 检查此示例程序:
public class MyFoo {
public <T extends MyFoo> T foo(){
System.out.println("foo");
return (T) this;
}
static class MyBar extends MyFoo{
public <T extends MyBar> T bar(){
System.out.println("bar");
return (T) this;
}
}
public static void main(String[] args) {
final MyFoo foo = new MyFoo().foo();
final MyBar bar1 = new MyBar().foo();
final MyBar bar2 = new MyBar().bar();
}
}
不幸的是,至少在Java7中,编译器推理到此结束,所以您不能这样做
new MyBar().foo().bar();
与第一个参数不同的是,调用者可以在某种程度上约束返回的类型,而对于第二个参数,您只知道将得到一个
ResponseCallBack
,如果需要子类型,则必须执行强制转换
例如,对于第一个,您可以执行以下操作:
Subtype temp = caller.<subtype> sendData(...); // Can also skip explicitly passing the type parameter too
因此,我认为这是一种在调用时确保类型安全的方法,同时允许调用方从他/她的代码中消除强制转换。当这种链接变得有用时?@Marcocierno这是否是一种好的模式有待讨论,但方法链接肯定不那么容易出错,因为你不必存储任何中间变量,也不必确定方法是返回原始实例还是新实例。是的,我知道这很好,我只是担心在泛型中使用这种“类型”是否有用。(因为它在intellij idea中给了我未经检查的演员阵容)。不管怎样,你是对的,他不想知道什么时候有用。
new MyBar().foo().bar();
Subtype temp = caller.<subtype> sendData(...); // Can also skip explicitly passing the type parameter too
Subtype temp = (Subtype) caller.sendData(...);