不明确的方法调用。修补链中的add(Unit)和AbstractCollection中的add(Unit)都匹配"



嗨,我在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))));

我在最后一行得到了这个内容的错误

"方法调用不明确。在Patchingchain中添加(Unit)和添加(Unit在AbstractCollection中匹配"

如何修复此错误?

解决方案是在最后一行中将units强制转换为PatchingChain

((PatchingChain) units).add(Jimple.v().newIdentityStmt(locThis, Jimple.v().newThisRef(RefType.v(c))))

出了什么问题

我已经研究了Soot的源代码。PatchingChain扩展了AbstractCollection,其标头如下所示:

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>

因此,我们有类型参数为sectionE的基类和sectionE extends Unit派生类。

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


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

相关内容

  • 没有找到相关文章

最新更新