2014-07-22 3 views
0

제네릭으로 여기에서 고민하고 있습니다. 일을 시작하기제네릭 - 제네릭 매개 변수를 사용하여 메서드 호출

, 나는 다음과 같은 콜백 인터페이스를 통해 개체의 목록을 반환하려면 :

콜백 인터페이스 : 지금까지 너무 좋아

public interface ArrayCallback<T> { 
    public void onComplete(List<T> result); 
} 

합니다.

노래 여기

public void loadSongs(ArrayCallback<Song> callback) { 
    List<Song> songs = new ArrayList<Song>(); 
    ... 
    callback.onComplete(songs); 
} 

없음 문제의 목록을로드하기 위해 콜백을 사용 : 자, 콜백을 사용하여,의 난과 같이 노래의 목록을 원하는 가정 해 봅시다. 하지만 이제 일부 유형의 음악 항목 목록을로드하려고합니다. 예전과 같은 노래 일 수도 있지만 앨범, 아티스트 등이 될 수 있습니다. 이러한 모든 유형의 수퍼 클래스를 호출했습니다. MusicItem. (그러므로 Song은 수퍼 클래스가 MusicItem입니다.) 여기가 넘어집니다. 다음 Aaaaand

public void loadMusicItems(MusicItemType type, ArrayCallback<? extends MusicItem> callback) { 
    switch (type) { 
     case Songs: 
      loadSongs(callback); 
      break; 
     case Albums: 
      loadAlbums(callback); 
      break; 
     default: 
      break; 
} 

문제는 loadSongs(callback) 라인에 작동하지 않습니다. 유형이 다르므로이 메서드를 호출 할 수 없습니다. 나의 이해에서

loadSongs(ArrayCallback<Song>) in MusicSource cannot be applied to loadSongs(ArrayCallback<capture<? extends MusicItem>>)

난 그냥 유형 T을 사용하고 있기 때문에 공분산 문제 와일드 카드를 사용할 필요가 없습니다.

나는 무엇을 할 수 있습니까? 이 질문을 쓰고 나면, 갑자기 메서드 호출의 경계를 제한하는 경우 컴파일러에 이상하게 보일 것입니다. 나는 여전히 미친 방법 설계와 별개로 내가하고있는 일에 관심이있다.

+0

Song이 MusicItem에서 상속 받았습니까? –

+0

예. 미안, 아마 그게 분명하지 않았어. – JRod

+0

'class ArrayCallback '-이 방법이 효과가 있습니까? – RandomQuestion

답변

2

일반 유형은 컴파일하는 동안 (유형 안전성을 보장하기 위해) 적용되며 런타임 중에 사라집니다. 따라서 귀하의 구현은 실제로 제네릭 유형의 사용을 위반합니다. 예 : 앨범 유형의 ArrayCallback을 사용하여 Song 유형 열거 형을 전달할 수 있습니다. (당신의 loadSongs 메쏘드가 앨범 타입의 ArrayCallback을 받는다는 것을 상상해보십시오!)

+0

그럼 완벽하게 이해가됩니다. 감사! – JRod

관련 문제