2013-06-12 5 views
0

이것이 가능한지 궁금합니다. Number을 보유하는 클래스를 만들고 있는데이 숫자는 Float 또는 Integer. 일 수 있습니다. 그러나 런타임에 결정됩니다.자바 리플렉션/동적 유형 캐스팅을위한 일반 유형

Float 또는 Integer 중 하나를 취할 수있는 더 우아한 함수를 만들고 싶습니다. 수학 함수를 사용하고 있습니다. 변수 유형을 열거 형에 저장 했으므로 generics를 사용하여이를 수행 할 수 있기를 기대합니다. /반사.

은 여기 내 열거

public enum Type { 

    FLOAT, 
    INTEGER; 

    public final Class clazz; 

    Type() { 
     if (this.name().equals("FLOAT")) 
      clazz = Float.class; 
     else if (this.name().equals("INTEGER")) 
      clazz = Integer.class; 
     else 
      clazz = null; 
    } 
} 

그것은 내 수업 내부입니다. 우리는 자바 알고, 당신은 동적으로 type.clazz lhzType = (type.clazz) lhs 같은 캐스트를 입력 할 수 있지만이 작업이 완료 얻기 위해 적절한 제네릭을 사용하는 방법이 지금

private <T extends Number> T compareTo(Class<T> lhs, Class<T> rhs) { 
    // lhs > rhs return 1 
    // rhs < lhs return -1 
    // else return 0 
} 

: 여기

몇 가지 코드? 반사 문제가 생기면 오류로 던져 질 수 있기 때문에 거기에있는 것처럼 느껴집니다. 하지만 지금은 Java로 발전한 메가가 아닙니다.

+2

(아이디어 것입니다 클래스 비교, 클래스의 개체를 비교 이해하지만 형식 비교)하지만 당신이 http://pastebin.com/By5Kb1KV를 사용하여 약간의 열거 형을 향상시킬 수있는 것 같다 – Pshemo

+2

난 혼란스러워 - 왜'compareTo'걸릴거야'클래스 'T' 대신's'입니까? –

답변

3

당신이 달성하려고하는 것을 이해하지 않지만, 내가 어떻게 당신이 게시 한 코드 조각을 구현하는 방법을 알 수 있습니다 :

첫째, 당신의 열거 생성자로 (경계) 클래스를 통과해야을 : 나는 당신이 그 클래스와을 에가는하는지 모르겠

public enum Type { 

    FLOAT(Float.class), 
    INTEGER(Integer.class); 

    private final Class<T extends Number & Comparable<T>> clazz; 

    Type(Class<T extends Number & Comparable<T>> clazz) { 
     this.clazz = clazz; 
    } 
} 

참고.

둘째, 당신의 방법은 전달 된 객체의 유형을 선언하는 유형 방법에 필요 당신은 당신의 열거의 클래스 형식을 참조 할 필요가 없으며, 방법은 정말하지 않습니다 enum 중 하나와 관련이 있습니다. 그것은 정적 유틸리티 메소드 어디 넣을 수 있습니다 : 모든 Number 서브 클래스가 compareTo()을 구현하면서 때문에

public static <T extends Number & Comparable<T>> int compareTo(T lhs, T rhs) { 
    return lhs.compareTo(rhs); 
} 

여기서 핵심은, NumberComparable<T> 모두에 바인딩의 Number 클래스는 하지 그것을 정의한다.


이 같은 반환 유형 매개 변수와 같은, 당신이 사용할 수있는 반사, 뭔가 : 나는 당신이 정말로 무엇을하려고 확실하지 오전

// Coded for brevity rather than "best practice" 
public static <T extends Number & Comparable<T>> T compareTo(Class<T> clazz, T lhs, T rhs) throws Exception { 
    String s = "some string that represents the value of the new Numner"; 
    T t = clazz.getConstructor(String.class).newInstance(s); 
    return t; 
} 
+0

좋아,하지만 다른 한가지가 있었다. 열거 형의 Type을 기반으로하는 Float을 새 번호로 만들고 싶다면 어떻게 선언 할 수 있습니까? 필자는 마지막 단락에서이 문제에 대해 언급했으나 내 질문에서도이를 강조해야했습니다. –

+0

기본적으로 열거 형은 * type *이 아닌 * operations *이어야한다고 생각합니다. 이런 종류의 선언은 매우 드문 일입니다.코드를 컴파일하지 않아도 열거 형을 어떻게 사용하고 싶은지에 대한 질문에 몇 가지 코드를 표시해야합니다. 그러면 아이디어의 의도를 이해할 수 있습니다. – Bohemian

+0

형식을 반환하는 가능한 구현의 편집 된 답변을 참조하십시오. 'clazz'는 당신의 열거 형에있는 clazz 일 수도 있습니다. – Bohemian