2014-01-30 7 views
-1

제네릭 (IParameter)의 목록 (IParameterCollection)이 있습니다.이 목록은 뭔가의 매개 변수가되어야합니다. 이 제네릭에는 실제 매개 변수의 유형을 포함하는 "유형"이 있습니다.제네릭 목록의 반환 값

enum Type { 
    TEST1(Integer.class), 
    TEST2(Double.class); 

    Class<?> _clazz; 

    private Type(Class<?> clazz) { 
     _clazz = clazz; 
    } 
    public Class<?> getClazz() { 
     return _clazz; 
    } 
} 

interface IParameterCollection { 
    IParameter<?> getParameter(Type type); 
} 
interface IParameter<T> { 
    public Type getID(); 
    public T getValue(); 
} 

IParameterCollection#getParameter(Type.TEST1).getValue() 

를 호출하고 하나에 캐스팅없이 정수 유형의 객체를받을 어떻게 든 수 있습니까?

원하는 작업 :

매개 변수가 포함 된 효과가 있습니다. getParameterCollection을 호출하고 IParameterCollection을 받기 원하는 매개 변수를 변경하려는 경우.

IParameterCollection parameters = effect.getParameterCollection(); 

가 지금은 그래서 내가 그 방법으로 제공 유형에 따라 특정 매개 변수

// should return the parameter with the generic type defined in the Type 
IParameter<Integer> parameter = parameters.getParameter(Type.TEST1); 
// should return Integer and not any unknown type 
parameter.getValue(); 

에 대한 해당 모음을 요청하십시오 returntype의 변경한다. 당신이 캐스팅 것을 방지 할 일은하려는 모든, 당신이 할 수 있다면

+0

이것은 정말로 분명하지 않습니다. 너는 정확히 무엇을하고 싶니? 구현 방법을 보여줄 수 있습니까? – Happy

+2

[Type Safe Heterogenous Containers의 키 제한] (http://stackoverflow.com/questions/21414076/limiting-keys-in-type-safe-heterogenous-containers)의 가능한 복제본. 또한 관련 : [자바 enum 리터럴은 제네릭 형식 매개 변수를 가질 수없는 이유는 무엇입니까?] (http://stackoverflow.com/questions/4290878/why-shouldnt-java-enum-literals-beable-to-have -generic-type-parameters) 및 [Java enums and generics] (http://stackoverflow.com/questions/5108733/java-enums-and-generics)를 참조하십시오. –

+0

폴 감사합니다, 내가 무엇을 찾고 있었는지. http://stackoverflow.com/questions/21414076/limiting-keys-in-type-safe-heterogenous-containers – andre

답변

-1

: 당신은 기본적으로

IParameter<Integer> parameter = parameters.getParameter(Type.TEST1); 

을하지만 :

public <T> IParameter<T> getParameter(Type type); 

그런 다음과 같이 호출 할 수 있습니다 너 캐스팅 만 숨기고있어. 잘못 입력하면 컬렉션에서 항목을 가져올 때 알 수 있습니다.

+0

나는 그것을 숨기고 싶지 않습니다. "유형"은 매개 변수의 유형을 알고 있습니다. – andre

+0

지우기 때문에 캐스팅을 숨기면 거의 모든 상황에서 사용할 수 있습니다. "유형"정보는 거의 전적으로 컴파일 유형의 아티팩트입니다. 그건 그렇고, downvote 주셔서 감사합니다 - 그것은 반응을 장려하는 좋은 방법입니다. – bcholmes

+0

@bcholmes 사실, 전 downvoter입니다. 그 서명은 정당화 될 수없는 확인되지 않은 던지기를 강요하기 때문에 나는 다운 받았다. 답변에서 이것을 암시하는 동안 누군가가 복사 할 수있는 코드는 여전히 나쁜 것입니다. –