이것은 삭제 유형의 결과입니다. 바이트 코드 레벨에서 일반 서명은 메소드의 추가 속성 일 뿐이므로 JVM의 메소드 디스패치에는 사용되지 않습니다. 실제 바이트 코드 레벨 시그니처는 유형 변수의 첫 번째 유형 (예 : 유형 변수 T extends Number&Serializable
의 경우 원시 서명이 T
을 대신 할 Number
이됩니다. 당신의 선언
,
public interface BaseService<T, ID> {
T findOne(ID id);
}
T
및 ID
는 Object
으로 치환된다 메소드가 지운 서명은 Object findOne(Object)
입니다. 소거 서명 Object findOne(Serializable)
을 갖도록 구현 방법을 일으키는 서브 타입 선언
public class BaseServiceImpl<T,ID extends Serializable> implements BaseService<T, ID> {
@Override
public T findOne(ID id) {
return null;
}
}
ID extends Serializable
의 소거 유형 Serializable
이다 들어
.
이 방법
Object findOne(Object)
를 호출 인터페이스
BaseService
를 사용하여 해당 코드를 보장하기 위해 구현 방법을 찾을 것입니다, 컴파일러가 서명
Object findOne(Object)
을 갖는
Object findOne(Serializable)
에 일반 대표로 구성된 입력을 수행하는
bridge method를 생성하는 것은 필요한 캐스트.
Method
인스턴스에서 isBridge()
을 호출하여 브리지 방법을 식별 할 수 있습니다.
결과에 영향을 미치기 위해 형식 지우기가 어떻게 작동하는지에 대한 지식을 사용할 수도 있습니다.
public class BaseServiceImpl<T, ID extends Object&Serializable>
implements BaseService<T, ID> {
@Override
public T findOne(ID id) {
return null;
}
}
가 일반적인 타입 시스템에 대해 어떤 의미 차이가 없지만에 선언을 변경 ID extends Object&Serializable
의 소거 Object
될 것이며, 따라서, findOne
방법의 결과 소거 인터페이스의 소거와 동일 할 것이다 따라서이 경우에는 브리지 메소드가 필요하지 않습니다.
'Object' 서명이 브리지 메소드로 표시되어 있는지 확인할 수 있습니까? – chrylis
@chrylis 네, 실제로 그렇습니다! 그것은 즉각적인 문제를 해결합니다. 무리 감사! 답변을 좀 더 넓히려면, upvote/accept를 기쁘게 생각합니다. – kaqqao
브릿지 규칙을 잘 이해하지 못해 적절한 답변을 작성하지 못했지만 수집 한 패턴에 맞는 것으로 나타났습니다. – chrylis