参数中未使用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

在java库中,我遇到了一个方法,该方法使用的是泛型返回类型,在参数中没有以任何方式使用:

<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(...);