Generics 为什么java 8中java.util.stream.stream的empty()方法(没有任何参数)包含类型参数?;
在Java8的流库中,我在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
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();