gpt4 book ai didi

java - 类型删除可防止重载,但允许覆盖

转载 作者:行者123 更新时间:2023-12-01 23:13:52 27 4
gpt4 key购买 nike

谁能向我解释一下为什么 Java 不允许这样做?我有这三个文件(针对 StackExchange 进行了剥离和简化):

一个父类(super class),在我的例子中是通用图。类型参数指示弧的表示方式:使用特定的弧类,或使用指示唯一 ID 的整数。

public interface Base<A> {
public boolean removeArc(A arc);
}

一个子类,具有 arc 的特定实现。

public interface Sub<B> extends Base<Arc<B>> {
@Override
public boolean removeArc(Arc<B> arc);

public Arc<B> removeArc(B value); //Removes an arc with this specific value.
}

弧的实现。

public interface Arc<B> {
}

Netbeans 在 Sub 中给了我以下编译时错误。在@Override:

name clash: removeArc(Arc<B>) in Sub overrides a method whose erasure is the same as another method, yet neither overrides the other
first method: removeArc(B) in Sub
second method: removeArc(A) in Base
where B,A are type-variables:
B extends Object declared in interface Sub
A extends Object declared in interface Base

第二种方法:

name clash: removeArc(B) in Sub and removeArc(A) in Base have the same erasure, yet neither overrides the other
where B,A are type-variables:
B extends Object declared in interface Sub
A extends Object declared in interface Base

问题似乎是removeArc(Arc<B>)removeArc(B)有相同的删除,但我不明白为什么会发生这种情况。正在删除removeArc(Arc<B>)编译正常,没有关于 @Override 的警告,所以它必须认识到 Arc<B>等于 ABase .

为什么Java无法区分Arc<B>B在这种情况下?

最佳答案

编译器在编译时删除泛型类。它将用其限制类替换占位符。

在这种情况下,Base 将用 Object 替换 A 的任何实例,而 Sub 将替换 A 的任何实例BObject

这给出了冲突的方法

在基类中public boolean removeArc(Object arc);

并在 Sub public Arc removeArc(Object value);

如果你这样做了

public interface Base<A extends Arc<?>> {
public boolean removeArc(A arc);
}

那么 A 的实例将被 Arc 替换,并且方法签名将不再冲突。

关于java - 类型删除可防止重载,但允许覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21518482/

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