我有以下结构:
public interface BarReturn {}
public interface FooReturn {}
public interface FooBarReturn extends FooReturn, BarReturn {}
public interface Foo {
FooReturn fooBar( );
}
public interface Bar {
BarReturn fooBar();
}
public interface FooBar extends Foo, Bar {
FooBarReturn fooBar();
}
Javac 失败并显示以下消息:
FooBar.java:2: types Bar and Foo are incompatible; both define fooBar(), but with unrelated return types
public interface FooBar extends Foo, Bar {
^
1 error
然而,Eclipse 可以很好地编译它,据我所知它应该编译 - FooBar 的 fooBar() 方法通过使用协变返回满足 Foo 和 Bar 的 fooBar() 方法的约定。
这是 Eclipse 编译中的错误还是 javac 中的错误?或者有没有办法说服javac编译它?作为参考,我的 javac 选项如下所示:
javac -d /tmp/covariant/target/classes -sourcepath /tmp/covariant/src/main/java: /tmp/covariant/src/main/java/Foo.java /tmp/covariant/src/main/java/BarReturn.java /tmp/covariant/src/main/java/FooBarReturn.java /tmp/covariant/src/main/java/Bar.java /tmp/covariant/src/main/java/FooReturn.java /tmp/covariant/src/main/java/FooBar.java -g -nowarn -target 1.6 -source 1.6
您正在 FooBar 界面中扩展 Foo 和 Bar。因此,您继承了两个返回类型不兼容的方法。 Java 协方差仅在遵循 Liskov 替换时才被允许。也就是说,重写的候选类型几乎必须是重写的返回类型的子类。
在你上面的例子中是这样的should编译:
public interface BarReturn {}
public interface FooReturn {}
public interface FooBarReturn extends FooReturn, BarReturn {}
public interface Foo {
FooReturn fooBar( );
}
public interface FooBar extends Foo{
FooBarReturn fooBar();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)