gpt4 book ai didi

java - 使用奇怪的泛型覆盖 java 方法中的错误

转载 作者:行者123 更新时间:2023-11-29 04:39:35 25 4
gpt4 key购买 nike

我正在 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方法。

the error message says :

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com