2017-05-22 1 views
7

:제한된 제네릭이 관련되어있을 때 Java에서 선언 된 두 가지 메소드가 있다고 주장하는 이유는 무엇입니까? 다음의 정의와

public interface BaseService<T, ID> { 

    T findOne(ID id); 

} 

public class BaseServiceImpl<T,ID extends Serializable> implements BaseService<T, ID> { 

    @Override 
    public T findOne(ID id) { 
     return null; 
    } 

} 

이유는 무엇입니까 BaseServiceImpl.class.getDeclaredMethods() 수익이 개 방법 :

  • public java.lang.Object BaseServiceImpl.findOne(java.io.Serializable)
  • public java.lang.Object BaseServiceImpl.findOne(java.lang.Object)

이를 필터링하는 방법이 있나요?

+3

'Object' 서명이 브리지 메소드로 표시되어 있는지 확인할 수 있습니까? – chrylis

+0

@chrylis 네, 실제로 그렇습니다! 그것은 즉각적인 문제를 해결합니다. 무리 감사! 답변을 좀 더 넓히려면, upvote/accept를 기쁘게 생각합니다. – kaqqao

+0

브릿지 규칙을 잘 이해하지 못해 적절한 답변을 작성하지 못했지만 수집 한 패턴에 맞는 것으로 나타났습니다. – chrylis

답변

5

이것은 삭제 유형의 결과입니다. 바이트 코드 레벨에서 일반 서명은 메소드의 추가 속성 일 뿐이므로 JVM의 메소드 디스패치에는 사용되지 않습니다. 실제 바이트 코드 레벨 시그니처는 유형 변수의 첫 번째 유형 (예 : 유형 변수 T extends Number&Serializable의 경우 원시 서명이 T을 대신 할 Number이됩니다. 당신의 선언

,

public interface BaseService<T, ID> { 
    T findOne(ID id); 
} 

TIDObject으로 치환된다 메소드가 지운 서명은 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 방법의 결과 소거 인터페이스의 소거와 동일 할 것이다 따라서이 경우에는 브리지 메소드가 필요하지 않습니다.

관련 문제