繁体   English   中英

方法中的通用声明

[英]Generic declaration in method

在以下代码示例中,恰好在get方法的返回类型之前的泛型类型声明<T>是什么意思?

public interface Listener<T, R> {
    <T> Listener<T, R> get();
}

我在Listener的类声明中理解了它的含义,但没有找到以这种方式使用<T>的实际示例。

它是方法范围内的参数化类型。 它仅在get()方法的范围内定义,并且隐藏了在Listener类中声明的T
隐藏类型是要避免的事情,在泛型类中定义方法范围的参数化类型通常是有问题的。

我想知道该参数在那个地方的作用。

这里T是由该方法的客户端推断出的类型。
但是由于此T与类中声明的T不同,因此它可以是不同的类型。
如果要将泛型类的T转换为客户端指定的另一种类型,则可能有意义。 例如,假设实现:

public class MyListener implements Listener<String, Integer>{

    @Override
    public <T> Listener<T, Integer> get() {
        return convert to T and return a new instance of Listener...;
    }

}

所以你可以这样写:

MyListener myListener = new MyListener();
Listener<Float, Integer> listener = myListener.get();

请注意,返回的ListenerMyListener不是兼容类型。


我要补充一点,您的接口实际上是一个功能接口,因为它声明了一个抽象实例方法。
使用泛型方法不允许将函数接口与lambdas主体一起使用,而只能与方法引用一起使用。

例如,这些无法编译:

Listener<String, Integer> invalidListener = () -> new MyListener<String, Integer>();
Listener<String, Integer> invalidListener2 = () -> new MyListener<>();

而方法参考将编译:

Listener<String, Integer> validListener = MyListener::new;

这是方法特定的参数化类型,但是...接口中已经定义了TR参数,因此应避免这种情况,因为它从接口隐藏了已定义的参数。

正确的用法示例是接口仅定义参数R

public interface Listener<R> {
    <T> Listener<R> get(T t);
}

但是,即使这种用法也值得怀疑。 这个例子很清楚-接口使用参数R并且仅其方法另外使用T 没有<T>特征的另一种方法将无法使用T

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM