作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 java 中尝试一些奇怪的泛型。在以下代码中,重写 foo
有效,但覆盖了 bar
没有。我不明白为什么。
请注意,这两个覆盖之间的唯一区别在于对 MB
的约束。 .当覆盖 foo
, MB
延伸Alpha<B, MB>
它有效。当覆盖 bar
MB
, 延伸Beta<B, MB>
它不起作用,即使Beta<B, MB>
延伸Alpha<B, MB>
.
我希望 MB extends Beta<B, MB>
和 Beta<A, MA> extends Alpha<A, MA>
会暗示 MB extends Alpha<B, MB>
.那么为什么它不起作用?
import java.util.function.Function;
abstract class Alpha<A, MA extends Alpha<A, MA>> {
abstract public <B, MB extends Alpha<B, MB>> MB foo(Function<A, B> f);
abstract public <B, MB extends Alpha<B, MB>> MB bar(Function<A, B> f);
}
class Beta<A, MA extends Beta<A, MA>> extends Alpha<A, MA> {
@Override public <B, MB extends Alpha<B, MB>> MB foo(Function<A, B> f) { return null; }
@Override public <B, MB extends Beta<B, MB>> MB bar(Function<A, B> f) { return null; }
}
最佳答案
区别在于约束MB extends Beta<B, MB>
与 MB extends Alpha<B, MB>
不同;所以它不会覆盖 bar
方法。
Main.java:10: error: name clash: <B#1,MB#1>bar(Function<A#1,B#1>) in Beta and <B#2,MB#2>bar(Function<A#2,B#2>) in Alpha have the same erasure, yet neither overrides the other
@Override public <B, MB extends Beta<B, MB>> MB bar(Function<A, B> f) { return null; }
因此,您需要更改通用约束,以便 Beta.bar
确实会覆盖 Alpha.bar
.
关于java - 使用奇怪的泛型覆盖 java 方法中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39779920/
我是一名优秀的程序员,十分优秀!