모호한 메서드 호출. Patchingchain의 add (Unit)와 AbstractCollection match의 add (Unit) 모두 "

조디 애봇

안녕하세요 저는 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) 모두"

이 오류를 어떻게 해결할 수 있습니까?

koto

해결책마지막 줄 에 캐스트 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관