模糊的方法调用。两者都在Patchingchain中添加(Unit)并在AbstractCollection中添加(Unit)匹配“

时间:2016-04-04 05:07:17

标签: java intellij-idea soot

您好我在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中添加(单位)并添加(单位)   在AbstractCollection中匹配“

我如何解决此错误?

1 个答案:

答案 0 :(得分:1)

解决方案是在最后一行投放unitsPatchingChain

((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>

所以我们的基类有类型参数部分 E ,派生类的部分 E extends Unit

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

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