2014-01-10 5 views
1

나는 모두 동일한 Block 클래스에서 상속받은 여러 클래스가 있으며 변수 값에 따라 그 중 하나를 인스턴스화하려고합니다. 여기 목록에서 유형 선택

내가 지금 무슨 짓을 :

나중에 그런
public enum MapCases { 
    FLOOR (Floor.class), // These are all subclass of my Block class 
    WALL (Wall.class), 
    ROCK (Rock.class); 

    private Class<?> blockType; 

    MapCases (Class<?> pointing) { 
     this.block = pointing; 
    } 

    public Class<?> getType() { 
     return this.blockType; 
    } 
}; 

, 내가 그들 일부 데이터 제공 인스턴스화하려고 :

private Block[] blocks; // Array of the mother type 
    ... 
    blocks = new Block[data.length]; // data is an int array 
    for (int i = 0; i < data.length; i++) { 
     int choice = data[i]; 
     Class<?> blockType = MapCases.values()[choice].getType(); 
     blocks[i] = new blockType(); // blockType is of unresolved type 
    } 

그러나 이클립스는 해결할 수없는 말을 나에게 오류를 보여줍니다 blockType을 유형 (java가 아직 유형을 알지 못한다는 사실을 감안할 때 논리적으로 보임).

어떻게하면 되겠습니까?

+1

시도해보십시오. 당신이 가지고있는 모든 곳에서 블록을 확장합니다. '?'. –

+0

나는 이런 일들이 가능하다는 것을 몰랐다. 그래도 작동하지 않습니다. 유형이 아직 해결되지 않았습니다. – Malharhak

답변

3

이 작업을 수행하기 위해 반사를 필요가 없습니다. 대신 이것을 고려 :이 경우

public enum MapCases { 
    FLOOR { 
     @Override 
     public Block makeBlock() { 
      return new Floor(); 
     } 
    }, 
    WALL { 
     @Override 
     public Block makeBlock() { 
      return new Wall(); 
     } 
    }, 
    ROCK { 
     @Override 
     public Block makeBlock() { 
      return new Rock(); 
     } 
    }; 

    public abstract Block makeBlock(); 
} 

를 열거 자체 공장 대신이 유지 된 Class 토큰 역할을합니다. 당신이 Class 토큰을 고수 할 않은 경우,이 코멘트에 Elliott Frisch points out로, Class<? extends Block>로 입력해야한다는


참고. 그런 다음 blockType.getConstructor().newInstance() (GGrec's answer demonstrates)을 호출하면 Block의 인스턴스가 반환됩니다.

+0

흥미 롭습니다. 그것은가는 좋은 방법 인 것 같습니다. 나는 그것을 지금 시도 할 것이다 – Malharhak

+0

동일한 것을 가진 다른 응답을 쓰고 있었다. 아주 좋고 깨끗합니다! – GGrec

+0

완벽하게 작동하는 것 같습니다. 감사! – Malharhak

2

리플렉션을 사용하여 청사진 클래스에서 새 인스턴스를 만듭니다.

패턴 :

Class.forName(className).getConstructor().newInstance(); 

귀하의 경우 :

blocks[i] = blockType.getConstructor().newInstance(); 
+0

더 나은 것 같지만 이클립스는 여전히 오류를보고 모든 종류의 인스턴스화 예외를 처리하는 try catch를 랩핑하도록 알려줍니다. 어떻게 든 정확한 유형이 필요하다고 가정합니다. – Malharhak

+0

모든 반사 메커니즘에는 확인 된 예외 처리가 필요합니다. 그래서 그들을 붙잡는 것은 괜찮습니다. – GGrec