gpt4 book ai didi

java - 方法调用不明确。 Patchingchain 中的 add(Unit) 和 AbstractCollection 中的 add(Unit) 均匹配”

转载 作者:行者123 更新时间:2023-12-02 03:44:56 25 4
gpt4 key购买 nike

您好,我在 intellij idea 中运行了包含这些说明的代码

SootClass c = Scene.v().loadClassAndSupport(name);
final Body b = Jimple.v().newBody(m);
PatchingChain<Unit> units = b.getUnits();
LocalGenerator locGen = new LocalGenerator(b)
Local locThis = locGen.generateLocal(RefType.v(c));
units.add(Jimple.v().newIdentityStmt(locThis, Jimple.v().newThisRef(RefType.v(c))));

我在该内容的最后一行遇到错误

"Ambiguous method call. Both add(Unit) in Patchingchain and add(Unit) in AbstractCollection match"

如何修复此错误?

最佳答案

解决方案是将最后一行的 units 转换为 PatchingChain:

((PatchingChain) units).add(Jimple.v().newIdentityStmt(locThis, Jimple.v().newThisRef(RefType.v(c))))
<小时/>

问题是什么?

我调查过Soot源代码。 PatchingChain 扩展了 AbstractCollection ,它的 header 如下所示:

public class PatchingChain<E extends Unit> extends AbstractCollection<E> implements Chain<E>

E extends Unit 部分很重要。当你查看java.util.AbstractCollection代码时,它如下:

public abstract class AbstractCollection<E> implements Collection<E>

因此,我们有带有类型参数部分 E 的基类和带有 E extends Unit 部分的派生类。

AbstractCollection 的方法 add(E e)PatchingChain 的方法 add(E o) 似乎具有相同的签名,因此看起来来自 PatchingChain (派生类)的签名应该覆盖来自 AbstractCollection (基类)的签名,并且编译器应该知道使用派生的。 但是,事实上,add 方法没有被重写,而是重载。这些泛型类中参数类型的声明会影响编译器如何看待这些方法。这两个 add 方法对编译器来说是可见的,即 add(E)add(E extends Unit),因此它们具有不同的签名,并且有需要手动指向编译器(通过转换为基类或派生类之一),它应该使用哪个类。

<小时/>

免责声明:这个答案是我试图扩展我对这个问题的评论,这似乎有帮助,并且基于我链接的网站。非常欢迎对我的答案进行编辑。

关于java - 方法调用不明确。 Patchingchain 中的 add(Unit) 和 AbstractCollection 中的 add(Unit) 均匹配”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36394936/

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