以下代码示例中方法<T>
的返回类型之前的泛型类型声明get
是什么意思?
public interface Listener<T, R> {
<T> Listener<T, R> get();
}
我在类声明中理解它的含义,Listener
但我没有找到<T>
以这种方式使用方法的实际示例。
它是一个方法范围的参数化类型。它仅在get()
方法的范围内定义,并且隐藏了T
在Listener
类中声明的内容。
隐藏类型是需要避免的,在泛型类中定义方法范围的参数化类型通常是有问题的。
我想知道参数在那个地方的作用是什么。
这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();
请注意,返回的Listener
和MyListener
是不兼容的类型。
我想补充一点,您的接口实际上是一个功能接口,因为它声明了一个抽象实例方法。
使用泛型方法不允许将函数接口与 lambdas 主体一起使用,而只能与方法引用一起使用。
例如,这些无法编译:
Listener<String, Integer> invalidListener = () -> new MyListener<String, Integer>();
Listener<String, Integer> invalidListener2 = () -> new MyListener<>();
而方法引用将编译:
Listener<String, Integer> validListener = MyListener::new;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句