方法中的泛型声明

豪尔赫·L·莫拉

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

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

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

戴维xxx

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

我想知道参数在那个地方的作用是什么。

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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java泛型:方法声明参数中的类型扩展

来自分类Dev

声明C#泛型类型方法

来自分类Dev

类声明中的泛型类型

来自分类Dev

Swift泛型:类型声明中的位置

来自分类Dev

C ++中的泛型方法

来自分类Dev

C ++中的泛型方法

来自分类Dev

方法声明中的泛型和对象之间有什么区别?

来自分类Dev

有没有办法在方法声明中定义两个泛型类型

来自分类Dev

为什么需要在JAVA的void静态方法签名中声明泛型?

来自分类Dev

泛型类中的泛型静态方法

来自分类Dev

非泛型类中的泛型方法

来自分类Dev

Scala泛型-ADT中的泛型提取器方法

来自分类Dev

泛型方法和泛型类中的类型推断

来自分类Dev

C ++:泛型类中的非泛型方法?

来自分类Dev

非泛型类中的泛型方法

来自分类Dev

在F#中的类型中声明泛型变量

来自分类Dev

何时在泛型方法的声明中使用<T>

来自分类Dev

如何使用参数Array <Codable>声明泛型方法?

来自分类Dev

如何使用泛型声明工厂方法

来自分类Dev

如何在方法声明中使用泛型

来自分类Dev

如何在Typescript中声明泛型承诺,以便当泛型类型为“ <void>”时,其方法之一不带参数?

来自分类Dev

庞大的Java类层次结构中繁琐的泛型声明

来自分类Dev

Java中具有泛型声明的ArrayList

来自分类Dev

在Swift中声明函数的泛型类型符合“可以被乘”

来自分类Dev

非泛型声明中不允许约束

来自分类Dev

非泛型声明中不允许约束

来自分类Dev

用Java中的复杂类声明泛型变量

来自分类Dev

在泛型方法中调用重载方法

来自分类Dev

泛型类声明的澄清