열거 형 값을 사용하고 해당 열거 형 값을 기반으로 클래스에 캐스팅 된 객체를 반환하는 메서드를 만들려고합니다. 예를 들어, 나는 열거가 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"유형의 변수가 작성 될 것이기 때문입니다.
, 컴파일하고이 코드를 실행하면 어떻게되는지? –
@JBNizet 위의 수정 사항을 참조하십시오. –
이것은 일반적인 방법이며 반환 된 형식은 컴파일러에서 인수 유형에 의해 유추 할 수 없습니다. 따라서 할당 된 변수의 유형에 의해서만 유추 될 수 있습니다. 당신은 언제나'entity. getComponentByType (ComponentType.HEALTH)'를 사용할 수 있습니다. –