pet*_*rov 5 java java-8 default-method
一本书的问题:
在过去(Java 8之前版本),您被告知将方法添加到接口是一种糟糕的形式,因为它会破坏现有代码.现在您被告知可以添加新方法,前提是您还提供默认实现.
- 这有多安全?描述接口的新
stream方法Collection导致遗留代码编译失败的情况.- 二进制兼容性怎么样?来自JAR文件的遗留代码是否仍会运行?"
我的答案如下,但我不太确定.
stream和相同签名的方法时(例如,在实现的遗留类中Collection),它才是安全的.否则,这个旧的遗留代码将无法编译. 任何人都可以确认或拒绝这些答案,或者只是为这些答案添加更多参数,参考或清晰度吗?
新的stream()默认方法Collection返回a Stream<E>,也是Java 8中的新类型.如果遗留代码包含stream()具有相同签名的方法,但返回其他内容,则会导致返回类型的冲突,因此遗留代码将无法编译.
只要没有重新编译,旧版代码就会继续运行.
首先,在1.7中,设置以下内容:
public interface MyCollection {
public void foo();
}
public class Legacy implements MyCollection {
@Override
public void foo() {
System.out.println("foo");
}
public void stream() {
System.out.println("Legacy");
}
}
public class Main {
public static void main(String args[]) {
Legacy l = new Legacy();
l.foo();
l.stream();
}
}
Run Code Online (Sandbox Code Playgroud)
用-source 1.7 -target 1.7,编译并运行:
$ javac -target 1.7 -source 1.7 Legacy.java MyCollection.java Main.java
$ java Main
foo
Legacy
Run Code Online (Sandbox Code Playgroud)
现在在1.8中,我们将stream方法添加到MyCollection.
public interface MyCollection
{
public void foo();
public default Stream<String> stream() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我们只MyCollection在1.8 编译.
$ javac MyCollection.java
$ java Main
foo
Legacy
Run Code Online (Sandbox Code Playgroud)
当然我们不能再重新编译Legacy.java了.
$ javac Legacy.java
Legacy.java:11: error: stream() in Legacy cannot implement stream() in MyCollection
public void stream()
^
return type void is not compatible with Stream<String>
1 error
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
352 次 |
| 最近记录: |