gpt4 book ai didi

Java非泛型方法隐藏具有交集类型的泛型方法

转载 作者:行者123 更新时间:2023-12-01 13:45:22 25 4
gpt4 key购买 nike

如果三个公共(public)接口(interface)定义为:

public interface One{}
public interface Two{}
public interface Three{}
另一个类 Super 定义为:
public class Super {
public static <E extends One & Two & Three> void hmm(E item) {}
}
为什么 Super 的以下子类会出现编译错误?
public class Subber extends Super{
public static void hmm(One item) {}
}
我希望上述方法可以简单地隐藏 Super 的方法,但似乎并非如此。
JLS (8.4.8.2) 说:

If a class C declares or inherits a static method m, then m is said to hide any method m', where the signature of m is a subsignature (§8.4.2) of the signature of m', in the superclasses and superinterfaces of C that would otherwise be accessible (§6.6) to code in C.


其中子签名在 8.4.2 中定义为:

Two methods or constructors, M and N, have the same signature if they have the same name, the same type parameters (if any) (§8.4.4), and, after adapting the formal parameter types of N to the the type parameters of M, the same formal parameter types.


The signature of a method m1 is a subsignature of the signature of a method m2 if either: m2 has the same signature as m1, or the signature of m1 is the same as the erasure (§4.6) of the signature of m2.


根据 JLS 4.6,类型变量的删除是其最左边界的删除,因此:
据我了解,Subber 的 hmm 方法与 Super 的 hmm 方法的删除相同,因此将是 Super 的 hmm 的子签名,因此意味着它会隐藏 Super 的 hmm。但是,我收到的错误消息(来自 eclipse),鉴于上述情况,这似乎没有意义:“Subber 类型的方法 hmm(One) 与 Super 类型的 hmm(E) 具有相同的删除,但没有把它藏起来。”我错过了什么?
编辑:精确的错误消息,其中主要方法仅包含 Subber.hmm(null);是:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
Name clash: The method hmm(One) of type Subber has the same erasure as hmm(E) of type Super but does not hide it

at base/testpack4.Subber.hmm(Subber.java:4)
at base/testpack4.Main.main(Main.java:5)
有人可以引用可靠的来源(最好是 JLS)解释为什么 Subber 的方法无法编译吗?

最佳答案

...Could someone explain why Subber's method does not compile...


implemented the code you listed ;逐字。还有我的 Main.main(String[])调用 Subber.hmm(null) 可以正常编译和 Subber.hmm(One) .
唯一不同的是我引入了一个新的 Four符合 <E extends One & Two & Three> void Super.hmm(E)的类型参数部分要求的接口(interface).
然后我传递了 Four 的实例进入 Subber.hmm(One)确认 Super.hmm(E)没有被调用;证明它实际上是隐藏的。

...citing a credible source (preferably the JLS)?...


That implementation行为与您引用的 JLS 规范完全一样。

关于Java非泛型方法隐藏具有交集类型的泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62665211/

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