2014-10-17 4 views
2

열거 형 값을 사용하고 해당 열거 형 값을 기반으로 클래스에 캐스팅 된 객체를 반환하는 메서드를 만들려고합니다. 예를 들어, 나는 열거가 componentType가 호출이 :입력 열거 형 값을 기반으로 캐스트 된 객체 반환

"HealthComponent"와 "HungerComponent는"모두 "구성 요소"라는 클래스를 확장하는 두 개의 클래스가
public enum ComponentType 
{ 
    HEALTH(HealthComponent.class), 
    HUNGER(HungerComponent.class); 

    private Class<? extends Component> componentClass; 

    private ComponentType(Class<? extends Component> componentClass) 
    { 
     this.componentClass = componentClass; 
    } 

    public Class<? extends Component> getComponentClass() 
    { 
     return componentClass; 
    } 
} 

. 그들 안에있는 것이이 질문에 중요하지 않습니다.

엔티티에는 할당 된 구성 요소 목록이 있습니다 (예를 들어 한 엔티티는 굶주림, 다른 엔티티는 상태, 다른 엔티티는 둘 다를 가질 수 있음).

내 목적은 ComponentType Enum의 값이 전달되면 해당 값에 해당하는 클래스 유형으로 변환 된 Component 객체가 반환되는 Entity 내부에 메소드를 만드는 것입니다. 따라서 ComponentType.HEALTH를 전달하면이 메서드는 HealthComponent에 캐스팅 된 객체를 반환합니다. 여기에 내가 노력하고 무엇이지만, 그것은 작동하지 않습니다 :

entity.getComponentByType(ComponentType.HEALTH); 

대상 : ComponentType.HEALTH의 유형에 전달할 때 : (편집 아래 참조) 위의 방법에 대한

public <T extends Component> T getComponentByType(ComponentType type) 
{ 
    Class<? extends Component> componentClass = type.getComponentClass(); 
    for(Component component : componentList) 
    { 
     if(component.getClass() == componentClass) 
     { 
      return (T) componentClass.cast(component); 
     } 
    } 
    return null; 
} 

, "HealthComponent"가 아닌 "Component"에 캐스트됩니다. Component가 아니라 HealthComponent에 캐스트 된 객체를 반환하기를 원합니다.

이렇게 할 방법이 있습니까? 나는 이것이 가능해야한다고 생각한다. 그것은이 모든 캐스팅을하고있는 것 같다 있기 때문에이 작업을 수행 할 수있는 방법을 찾으려고 노력에 대한 나의 이유는 :이 방법은 (희망) 내가 전달 componentType가에 의해 캐스팅하고 싶은 가정 할 수 있기 때문에

HealthComponent component = (HealthComponent) entity.getComponentByType(ComponentType.HEALTH); 

조금 낭비 에

편집 (상세 정보) :. 결과를 자세히 살펴보면

, 나는 내 위의 방법을 일부-무엇을 작동 것으로 나타났습니다. 그것이 <Component> Component

를 반환 말한다

component = entity.getComponentByType(ComponentType.HEALTH); 

가 반환을 확인하려면 getComponentByType을 위로 마우스를 이동 한 후 (구성 요소 변수가 아직 정의되지 않음)과 : 내가이 의미하는 것은 이클립스에서, 나는 밖으로 입력하는 경우이다 ,

HealthComponent component = entity.getComponentByType(ComponentType.HEALTH); 

그리고 그 반환을 확인하려면 getComponentByType 위에 마우스를 올려 놓고 그것을 : 내가 수동으로 변수 유형을 정의하면

그러나,이 같은 (대부분의 시간을 그냥 이클립스 나를 위해 변수를 만들 수) 그것이 돌아오고 있다고 말합니다 <HealthComponent> HealthComponent이고 컴파일되고 실행됩니다. 그래서 기술적으로 작동하지만, 내가 원하는 방식은 아닙니다. 이것은 작은 문제입니다. Eclipse에 첫 번째 예제에서 로컬 변수를 작성하라고 지시하면, 수동으로 변경해야하는 "Component"유형의 변수가 작성 될 것이기 때문입니다.

+0

, 컴파일하고이 코드를 실행하면 어떻게되는지? –

+0

@JBNizet 위의 수정 사항을 참조하십시오. –

+0

이것은 일반적인 방법이며 반환 된 형식은 컴파일러에서 인수 유형에 의해 유추 할 수 없습니다. 따라서 할당 된 변수의 유형에 의해서만 유추 될 수 있습니다. 당신은 언제나'entity. getComponentByType (ComponentType.HEALTH)'를 사용할 수 있습니다. –

답변

1

구성 요소를 선택하는 데 사용하는 매개 변수에 따라 getComponentByType()의 컴파일 타임 반환 유형을 사용하려고합니다. 이것은 제네릭에서 가능하지만 매개 변수가 실제로 필요한 컴파일 타임 형식 정보를 전달하는 경우에만 가능합니다.

유감스럽게도 유형 매개 변수를 열거 형 값 (this question 참조)에 추가 할 수는 없지만 자신의 코드를 다시 보면 원하는 구성 요소를 정확하게 설명하는 객체가 이미 있음을 알 수 있습니다. 그리고 그것은 우리가 필요로하는 타입 정보를 운반하게됩니다 : Class<> 각 컴포넌트 타입의 객체!

그래서, 여기 함수에 대한 나의 제안은 (내 자바 녹슨 수 있습니다, 조심 컴파일 또는 테스트하지)이다 : 그래서

public <T extends Component> T getComponentByType(Class<T> type) 
{ 
    for(Component component : componentList) 
    { 
     if(component.getClass() == type) 
     { 
      return (T)component; 
     } 
    } 
    return null; 
} 
+0

나는 이것이 나를 위해 일할 것이라고 생각한다. 고마워! –

관련 문제