我想在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
好的人,我現在明白了。總之,在改變泛型類型的邊界時,你不能重寫一個方法。期。無論您是否使用泛型類型和事件,無論如何使用它。 –