2013-07-19 2 views
1

슈퍼 클래스 "Animal"과 하위 클래스 "Cat", Dog, Bird "가 있습니다. 가능한 각 인스턴스를 인스턴스화 할 수있는 클래스 인스턴스 대신 하위 클래스 유형의 배열을 가질 수있는 방법이 있습니까? ? 내가 그렇게 할 수있는 방법자바 : 서브 클래스 유형의 배열을 갖는 방법?

Pseudo code: For each possible subclass of "Animal": create an instance of that class. 

편집 : 서브 클래스

단순화하기 위해, 나는이 싶어? 내가이 서브 클래스의 인스턴스의 배열을 원하지 않는다, 나는의 배열을 원하는 오브젝트 유형.

+0

다형성 .... – DGomez

+1

질문이 명확하지 않습니다. – nachokk

+1

이것은 집에서 일하는 것처럼 보입니다. –

답변

1

OP의 코멘트 후
리플렉션을 사용해도 클래스의 모든 서브 섹션을 가져올 방법이 없습니다.
그러나 당신은 다른 방법으로 그것을 할 수 있습니다, 당신은 말할 수 있지만 유일하지만 가장 긴 방법입니다.

  • 이 서브 클래스 나 구현 원하는 클래스 또는 인터페이스


가 있는지 확인하기 위해 클래스 패스

  • 로드 각 클래스 및 테스트에 존재하는 모든 클래스의 이름의 목록을 가져옵니다 영업 이익의 코멘트 전에

    대답

    귀하의 질문에 아직 명확하지 않다 그러나 나는 심지어 superclass 또는 subclass의 인스턴스입니다 모든 인스턴스를 저장합니다 배열 또는 컬렉션을 사용하려는 것 같아요.
    그러면 나는 이렇게 할 필요가 있다고 생각합니다.

    List<Object> list = new ArrayList<Object>(); 
         list.add(new Cat()); 
         list.add(new Dog()); 
         list.add(new Animal()); 
         list.add(new Cat()); 
    
         for (int i = 0; i < list.size(); i++) { 
    
          if(list.get(i) instanceof Cat){ 
           System.out.println("Cat at "+i); 
          }else if(list.get(i) instanceof Dog){ 
           System.out.println("Dog at "+i); 
          }else if(list.get(i) instanceof Animal){ 
           System.out.println("Animal at "+i); 
          } 
         } 
    

    이 코드는
    참고 테스트 : 그렇지 않으면이 두 경우를 통과 할 것이다, 상단에있는 예제 코드 (list.get(i) instanceof Animal)의 경우처럼 부모 클래스의 체크 표시를하지 마십시오 명심 (검사하는 경우 if-if-if 만) 또는 한 사례를 건너 뜁니다 (검사가 if-else if-else if 인 경우 항상 Animal로 객체를 반환 함) (list.get(i) instanceof Animal)(list.get(i) instanceof Cat) 반환 객체가 Cat 객체 인 경우.

  • +0

    내가 원하는 것은 이러한 유형의 객체를 인스턴스화하는 데 사용할 수있는 객체 유형의 배열입니다. 그게 가능하다면. –

    3

    당신은 이것을 달성하기 위해 Ploymorphism을 사용할 수 있습니다.

    Animal[] animalArray = new Animal[10]; 
    animalArray[0] = new Dog(); 
    animalArray[1] = new Cat(); 
    

    기본적으로 모든 동물 클래스의 하위 클래스입니다. 객체를 가져 오려면 간단히 입력 할 수 있습니다.

    Dod dog = (Dog)animalArray[0]; 
    

    getClass() 메소드를 사용하면 간단하게 클래스를 알 수 있습니다. 예를

    Animal[] animalArray = new Animal[10]; 
        animalArray[0] = new Dog(); 
        System.out.println(animalArray[0].getClass()); 
    

    를 들어 class Dog를 인쇄합니다.

    +0

    @ Jason 맞습니다. 당신은 방금 그것을 편집 할 수 있습니다 :) –

    1

    다른 답변에서 언급했듯이 순수한 반사는 사용할 수 없습니다.

    이 케이스를 특별히 처리하도록 클래스를 사용자 정의 할 수없는 경우 클래스 로더의 클래스를 반복하거나 내부 데이터 구조에 정보를 추가하는 사용자 정의 클래스 로더를 사용해야합니다. 나중에 모든 수업을 반복하지 않아도됩니다.

    클래스 로더 코드로 다이빙하는 것에 관심이 없다고 가정하면 (클래스 사용자가 아닌 것처럼 들릴 수도 있음), 클래스 로딩 시간에 실행되는 클래스에 정적 코드를 추가하는 것이 가장 좋은 방법입니다. 예를 들면 :

    public class Animal { 
        protected static List subclasses = new ArrayList(); 
        //... 
    } 
    
    public class Cat extends Animal { 
        static { 
         subclasses.add(Cat.class); 
        } 
        //... 
    } 
    

    이이 코드 대신 클래스의 클래스 로더에 살고있는 것입니다 사용자 정의 클래스 로더와 함께 할 것입니다 무슨 본질적 될 것이다.

    모든 하위 클래스에 대해이 패턴을 반복하십시오. 그런 다음 인스턴스를 만들려는 경우 (또는 생성자에 인수가있는 경우 다른 적절한 리플렉션 메서드)를 사용하여 인스턴스화 할 클래스 참조가 subclasses 목록에 있습니다.