안녕하세요 저는 intellij 아이디어에서 이러한 지침이있는 코드를 실행합니다.
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의 add (Unit)와 AbstractCollection 일치의 add (Unit) 모두"
이 오류를 어떻게 해결할 수 있습니까?
해결책 은 마지막 줄 에 캐스트 units
하는 것 PatchingChain
입니다.
((PatchingChain) units).add(Jimple.v().newIdentityStmt(locThis, Jimple.v().newThisRef(RefType.v(c))))
뭐가 문제 야?
그을음 소스 코드를 살펴 보았습니다 . 는 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>
그래서 우리는 type 매개 변수 섹션이있는 기본 클래스와 섹션이있는 E
파생 클래스가 있습니다 E extends Unit
.
AbstractCollection
의 방법 add(E e)
과 PatchingChain
의 방법은 add(E o)
그것에서 한 것으로 보이는, 그래서 동일한 서명을 갖고있는 것 같아요 PatchingChain
(파생 클래스)에서 하나의 오버라이드 (override) 할 필요가 있습니다 AbstractCollection
(기본 클래스), 그리고 컴파일러는 하나의 파생 사용하는 알아야한다. 그러나, 사실, add
방법은되지 오버라이드 가있어, 오버로드 . 이러한 제네릭 클래스의 매개 변수 유형 선언은 컴파일러가 해당 메서드를 보는 방식에 영향을줍니다. 두 add
메서드는 add(E)
및 로 컴파일러에 표시 add(E extends Unit)
되므로 서명이 다르며 사용해야하는 컴파일러를 수동으로 가리켜 야합니다 (기본 또는 파생 클래스 중 하나로 캐스팅).
면책 조항 :이 답변은 질문에 대한 내 의견을 확장하려는 시도로, 도움이되는 것처럼 보였으며 저가 링크 한 웹 사이트를 기반으로했습니다. 내 대답에 대한 편집은 환영합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다