제네릭으로 여기에서 고민하고 있습니다. 일을 시작하기제네릭 - 제네릭 매개 변수를 사용하여 메서드 호출
, 나는 다음과 같은 콜백 인터페이스를 통해 개체의 목록을 반환하려면 :
콜백 인터페이스 : 지금까지 너무 좋아
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
을 사용하고 있기 때문에 공분산 문제 와일드 카드를 사용할 필요가 없습니다.
나는 무엇을 할 수 있습니까? 이 질문을 쓰고 나면, 갑자기 메서드 호출의 경계를 제한하는 경우 컴파일러에 이상하게 보일 것입니다. 나는 여전히 미친 방법 설계와 별개로 내가하고있는 일에 관심이있다.
Song이 MusicItem에서 상속 받았습니까? –
예. 미안, 아마 그게 분명하지 않았어. – JRod
'class ArrayCallback'-이 방법이 효과가 있습니까? –
RandomQuestion