In a java library I came across a method which uses a generic return type that is not used in any way in the parameters:
<T extends ResponseCallBack> T sendData(@Nonnull final OrderIf checkoutOrder, @Nullable final List<NameValueIf> ccParmList) throws Exception;
(ResponseCallBack
is an interface here)
What is the difference with this signature:
ResponseCallBack sendData(@Nonnull final OrderIf checkoutOrder, @Nullable final List<NameValueIf> ccParmList)
The difference is that you can use this special version for method chaining.
Check this sample program:
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();
}
}
The assignment of the bar1 variable is only possible because of the <T extends MyFoo>
, without it, there would have to be a cast:
final MyBar bar1 = (MyBar) new MyBar().foo();
Unfortunately, at least with Java 7, compiler inference ends here, so you can't do
new MyBar().foo().bar();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With