Java 方法中的泛型声明

Java 方法中的泛型声明,java,generics,Java,Generics,在下面的代码示例中,get方法的返回类型前面的泛型类型声明是什么意思 public interface Listener<T, R> { <T> Listener<T, R> get(); } 公共接口侦听器{ 侦听器get(); } 我理解它在Listener的类声明中的含义,但我没有找到一个将以这种方式用于方法的实际示例。它是一种方法范围的参数化类型。它仅在get()方法的范围内定义,它隐藏了Listener类中声明的T。 隐藏类型是需要避免的

在下面的代码示例中,
get
方法的返回类型前面的泛型类型声明
是什么意思

public interface Listener<T, R> {
    <T> Listener<T, R> get();
}
公共接口侦听器{
侦听器get();
}

我理解它在
Listener
的类声明中的含义,但我没有找到一个将
以这种方式用于方法的实际示例。

它是一种方法范围的参数化类型。它仅在
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...;
    }

}
方法引用将编译:

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

这是一种特定于方法的参数化类型,但。。。接口中已经定义了
T
R
参数,因此应避免这样做,因为它会对接口隐藏已定义的参数

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

public interface Listener<R> {
    <T> Listener<R> get(T t);
}
公共接口侦听器{
侦听器get(T);
}

然而,即使是这种用法也值得怀疑。示例很清楚-该接口使用参数
R
,并且仅其方法使用
T
。没有这个
信号的另一种方法将无法使用
T

谢谢你,但为什么这是一个糟糕的问题,并且被标记为否定点?我没有投反对票,但我猜:因为你没有表现出任何研究成果。如果你说的是“我研究了教程,它说的是某某,但这与这个和那个有什么关系?”这样的话,你的问题可能会得到更好的回答。太多的人懒得使用搜索引擎,人们对此感到厌倦。哦,我试图避免任何不必要的信息来准确回答问题,但是我会接受你的建议,我并不知道。这些信息使你的问题更具体,质量更高,而不是一个简单地通过看基本泛型教程来回答的问题不是“不必要的信息”我只是检查了这个,我以前没有注意到这种行为,我现在很清楚了,谢谢你,另一方面,我想知道我的问题有什么不好的地方,这是我应该假设的。你的问题一点也不坏。我投了赞成票。也许说你理解
课堂声明中的意思会让事情变得更好。@JorgeL.Morla:不是你的反对票,但你的问题没有显示出之前对这个问题进行研究的证据。是的,你可能已经做了一些研究,但是在问题本身的文本中没有具体的证据。本网站期待更多的问题和答案,并鼓励会员对这两个问题的质量进行投票。
Listener<String, Integer> validListener = MyListener::new;
public interface Listener<R> {
    <T> Listener<R> get(T t);
}