在将我的 Eclipse IDE 安装从 Oxygen.3a (4.7.3) 更新到 Photon 时,我注意到尽管之前编译(和工作)正常,但我的一些代码已经损坏。
考虑以下代码:
import java.util.ArrayList;
import java.util.stream.Stream;
public class Test {
class MyClass {
}
interface MyInterface {
}
public static void main(String[] args) {
Stream<MyClass> myClassStream = new ArrayList<MyClass>().stream();
Stream<MyInterface> myInterfaceStream = new ArrayList<MyInterface>().stream();
Stream<MyInterface> concatenation = Stream.concat(
// Tooltip for filter() displays the result type of Stream<MyClass>
myClassStream.filter(element -> element instanceof MyInterface),
// Tooltip displays type Stream<MyInterface>
myInterfaceStream);
}
}
在 Photon 中,会出现一个错误,指出Stream.concat返回的是Stream<Object>,而不是Stream<MyInterface>。在 Oxygen 中,它没有(返回类型是Stream<MyInterface>)。看起来有些东西隐式地将返回类型转换filter为Stream<? extends MyClass, MyInterface>,然后导致Stream.concat返回预期类型。当然,这在语义上是安全的,因为返回的流中的所有元素都filter实现了MyInterface。
为什么这段代码会破解?我怎么能得到以前的行为?
相关分类