2014-02-19 3 views
2

수퍼 클래스 (특히 내 클래스 Mob)의 목록을받는 메서드가 있습니다. 그것은 다음과 같습니다 :이 문제의 방법이다수퍼 클래스 목록에 하위 클래스 개체 추가

spawnMob(new Zombie(World.getInstance(), 0, 0), World.getInstance().getZombies()); 

을 :

List<? extends Mob> mobs 

내가 같이,이 목록에 슈퍼 클래스 마피아를 확장하는 모든 객체를 추가 할 수 있도록

public static void spawnMob(Mob mob, List<? extends Mob> mobs){ 
    mobs.add(mob); 
} 

이 코드 줄 World.getInstance().getZombies()은 좀비 객체 목록을 반환합니다. 좀비가 마피아를 확장시킵니다. 그러나

코드 행 :

The method add(capture#1-of ? extends Mob) in the type List<capture#1-of ? extends Mob> is not applicable for the arguments (Mob) 

내가 무엇을 할 수는이 문제를 해결하려면 :

mobs.add(mob); 

이 오류가 발생합니다?

The method spawnMob(Mob, List<Mob>) in the type MobSpawner is not applicable for the arguments (Zombie, List<Zombie>) 
+0

왜'목록 mobs' 등의 목록을 정의하지 않는 등의 폭도 목록을 작성? Mob을 확장하는 오브젝트를 해당 목록에 추가 할 수 있습니다. – exception1

답변

2

null 이외에는 아무 것도 추가 할 수 없습니다. List은 와일드 카드를 사용합니다. List<? extends Mob>Mob까지 확장 될 수 있습니다. 컴파일러가 알고있는 모든 것에 대해 List<Mafia> 일 수 있습니다. List<Mafia> 일 수있는 ListZombie을 추가 할 수 없습니다. 형식 안전성을 유지하기 위해 컴파일러는 이러한 호출을 방지해야합니다.

이러한 목록에 추가하려면 와일드 카드를 제거해야합니다. 특정 서브 클래스와 List의 전달해야 할 수도

public static void spawnMob(Mob mob, List<Mob> mobs){ 

, 다음 일반적인 방법을 고려해보십시오 :

public static <T extends Mob> void spawnMob(T mob, List<T> mobs){ 
1

List<Mob> mobs으로 시도 :

편집, List<Mob>을 제외시켰다 할 수있는 방법을 변경 한 후 나는이 오류가 발생합니다.

+0

이것은 의미가 있지만 지금이 오류가 발생합니다. 'MobSpawner 유형의 메소드 spawnMob (Mob, List )이 인수에 해당되지 않습니다 (좀비,리스트 )' – user3316633

+0

메소드를 변경하지 말고 ' 'mobs' 선언 –

1

당신은 단지 List<Mob> mobs으로 목록을 선언 할 수 있습니다, 그리고 Mob의 서브 클래스가 될 것입니다 받아 들였다. 목록에서 항목을 가져올 때 유형이 Mob임을 알 수 있습니다. 어떤 유형인지 확인하려면 몇 가지 테스트를 수행해야합니다.

0

그냥

List<Mob> mobs; 
관련 문제