我想在java中的一些奇怪的泛型。在以下代码中,foo
上的替代适用,但bar
上的替代不适用。我不明白为什么。用怪异的泛型在java方法中覆盖错误
请注意,两个覆盖之间的唯一区别在于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; }
}
[这里是一个简化版本](http://ideone.com/j9QkOG)同样的问题。当您覆盖泛型方法时,您无法更改类型参数的边界。 – Radiodef
相关http://stackoverflow.com/questions/23438813/cannot-override-generic-interface – Tunaki
好的人,我现在明白了。总之,在改变泛型类型的边界时,你不能重写一个方法。期。无论您是否使用泛型类型和事件,无论如何使用它。 –