Generics 为什么java 8中java.util.stream.stream的empty()方法(没有任何参数)包含类型参数?;

Generics 为什么java 8中java.util.stream.stream的empty()方法(没有任何参数)包含类型参数?;,generics,java-8,generic-method,Generics,Java 8,Generic Method,在Java8的流库中,我在Java.util.stream.stream中的相同方法中发现了一个有趣的问题: static Stream empty() 我们可以看到,方法签名中没有参数。根据我的理解,在这种情况下,在可选说明符-static之后不应该有类型参数-。例如,在方法Optional findAny()中,没有按预期给出类型参数 那么有人能解释一下为什么静态流empty()包含类型参数吗 让我们首先声明自己的类型,以便更好地理解原因: static interface Stream

在Java8的流库中,我在
Java.util.stream.stream
中的相同方法中发现了一个有趣的问题:

  • static Stream empty()
我们可以看到,方法签名中没有参数。根据我的理解,在这种情况下,在可选说明符-
static
之后不应该有类型参数-
。例如,在方法
Optional findAny()
中,没有按预期给出类型参数


那么有人能解释一下为什么
静态流empty()
包含类型参数吗

让我们首先声明自己的类型,以便更好地理解原因:

static interface Stream<T> {

    public static Stream<T> empty() { // will not compile here
        return new Stream<T>() {
        };
    }

}
这将很好地编译,但是有一个隐藏的问题-类
T
和方法
T
是完全独立的,它们之间没有关系

这本可以像这样写,具有完全相同的效果(而且更干净):


这将生成一个警告-您正在隐藏在类级别(
)声明的
)和方法中的一个。这是因为
findAny
不是静态的,它使用了已经声明的类型参数——您通过引入另一个
来隐藏该类型参数,该类型参数与类级别的一个形式没有关系

请参阅类型推断:@holi java我认为这与类型推断没有多大关系…@Eugene嘿,这一节对它进行了准确的描述。我认为OP已经开始学习泛型了,所以我希望他先看看类型推断
public static <T> Stream<T> empty() { // notice the extra <T>
   return new Stream<T>() {
   };
}
public static <R> Stream<R> empty() {
    return new Stream<R>() {
    };
}
public <T> Optional<T> findAny();