您好我在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中匹配“
我如何解决此错误?
答案 0 :(得分:1)
解决方案是在最后一行投放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>
所以我们的基类有类型参数部分 E
,派生类的部分 E extends Unit
。
AbstractCollection
的方法add(E e)
和PatchingChain
的方法add(E o)
似乎具有相同的签名,所以它看起来像是来自PatchingChain
(派生类)的一个应该覆盖AbstractCollection
(基类)中的一个,编译器应该知道使用派生类。 但是,实际上,add
方法并非覆盖,已超载。这些泛型类中的参数类型声明会影响编译器查看这些方法的方式。编译器可以看到两个add
方法add(E)
和add(E extends Unit)
,因此它们具有不同的签名,并且需要手动指向编译器(通过强制转换为其中一个类,无论是基地还是派生的,应该使用哪一个。
免责声明:这个答案是我试图将我的评论扩展到这个问题,这似乎有所帮助,并且基于我链接的网站。编辑我的回答非常受欢迎。