作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下结构:
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 接口(interface)中扩展了 Foo 和 Bar。因此,您继承了两种返回类型不兼容的方法。 Java 协方差仅在遵循 Liskov 替换时才允许。也就是说,覆盖的候选类型必须几乎是覆盖的返回类型的子类。
在你上面的例子中,像这样的东西应该编译:
public interface BarReturn {}
public interface FooReturn {}
public interface FooBarReturn extends FooReturn, BarReturn {}
public interface Foo {
FooReturn fooBar( );
}
public interface FooBar extends Foo{
FooBarReturn fooBar();
}
关于java - 接口(interface)中的协变返回类型未通过 Javac 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7056485/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!