2011-03-31 3 views
1

안녕 얘들 아, 문제가있어. Animal 인터페이스가 있다고 가정 해보십시오. 그런 다음 Dog, Cat, Goat와 같은 클래스를 구현합니다. 이 클래스들 각각은 인터페이스로부터 얻는 update() 함수를 가지고 있다고 말한다.인터페이스 arraylist에서 특정 개체를 얻는 방법

나는 모든 동물 종류 (개, 고양이, 염소)의 모든 종류를 포함하는 동물의 arraylist 있습니다. 나는라는 문자열을 주어진 경우 "염소는"내가 어떻게

답변

6
for (Animal a : animals) { 
    if (a instanceof Goat) { 
     a.update(); 
    } 
} 

... 그 ArrayList를 검색하고 개와 고양이 무시하고 단지 염소 업데이트() 함수를 선택할 것 당신은 정말에만 문자열 "염소가있는 경우 "당신을 이동하려면 다음과 같이 뭔가를 할 수 :

Map<String, Class<? extends Animal>> map = new HashMap... 
map.put("Goat", Goat.class); 

//... 
if (map.get("Goat").isInstance(a)) { 
    a.update(); 
} 
:
if (a.getClass().getName().endsWith("Goat")) { 
    //... 

또는 문자열 클래스의 이름과는 아무 상관이없는 경우, 당신은 클래스의 인스턴스에 문자열을 매핑 할 수 있습니다

내 의견으로는 Google's Guava이 최선의 선택입니다.

for (Goat g : Iterables.filter(animals, Goat.class)) { 
    g.update(); 
} 
+0

대단히 감사합니다. 그냥 자바를 다시 시작하고 기본을 잊어 버렸습니다 ... – thunderousNinja

+0

그래, 난 두 번째 옵션은 트릭을 했어 그래서 난 갈 문자열이 – thunderousNinja

+1

@ 조나단 : 당신도 조심하길 원할 것입니다, 이것은 또한 모든 'PrairieDog' 예를 들어''Dog "'를 넘긴다면. 더 좋은 방법은'a.getClass(). getSimpleName(). equals ("Goat")'를 사용하는 것입니다. 그러나 두 경우 모두 Goat의 하위 클래스와 정확히 일치하지는 않으며 'Goat'인 객체 만 일치하게됩니다. 세 번째 옵션은 더 안정적입니다. –

0

각 개체의 유형을 묻는 목록을 검토해야 할 것 같습니다. 만약 당신이 List<Animal>을 가지고 있다면 (내가 아는 한) 그것의 유일한 서브 클래스를 얻는 쉬운 일선 방법이 없다.

1
public void goatUpdate(List<Animal> animals) { 
    for (Animal animal : animals) { 
     if (animal instanceof Goat) { 
      animal.update(); 
     } 
    } 
} 
관련 문제