2010-05-28 4 views
3

<P extends Enum<P>>입니다, 내가 열거입니다 제네릭 형식 P을 가지고 가정, 그리고 예를 들어, 문자열에서 열거 값을 얻으려면 : P.class가 유효하지 않기 때문에자바 일반 유형의 클래스 개체를 찾는 방법은 무엇입니까?

String foo = "foo"; 
P fooEnum = Enum.valueOf(P.class, foo); 

이것은 컴파일 오류가 발생합니다 . 위의 코드가 작동하도록하려면 어떻게해야합니까?

답변

4

Enum#getDeclaringClass()으로 선언 클래스를 잡을 수 있도록이 제네릭 형식의 런타임 인스턴스가 있어야합니다. 메소드 인수로 P p을 어딘가에 선언했다고 가정하면 다음과 같습니다.

예.

public static <P extends Enum<P>> P valueOf(P p, String name) { 
    return Enum.valueOf(p.getDeclaringClass(), name); 
} 
+0

아니요 런타임 인스턴스 p가 없습니다 ... p가 있으면 해당 행을 실행할 필요가 없습니다. 열거 형 이름 만 있고 그 문자열에서 p를 얻고 싶습니다. –

+0

런타임 인스턴스가 없으면 일반 유형의 런타임 클래스를 표시 할 수 없습니다. Java의 제네릭은 C#과 같이 * 구체화되지 않습니다. – BalusC

3

Java에서는 방법이 없습니다. 일반 유형은 이 지워지고이며 바이트 코드로 Object으로 변환됩니다. 제네릭 형식 (귀하의 경우 'P')은 실제 클래스가 아니라 단지 자리 표시 자입니다.

유형 삭제에 대한 좋은 답변이있는 this question을 살펴보십시오.

1

Java는 유형 지우기라는 것을 사용하여 제네릭을 구현합니다. 즉, 실제 제네릭 매개 변수는 런타임에 지워집니다. 따라서 제네릭 형식 매개 변수에서 형식 정보를 유추 할 수 없습니다.

0

발신자 또는 일부 구성 제공자가 런타임에 가져올 수 있습니다. 예를 들어, Spring이나이를 구성 할 수 있습니다.

class Converter<P extends Enum> { 
    private Class<P> type; 

    //setter and getter 

    public P valueOf(String name) { 
     return Enum.valueOf(type, name); 
    } 
} 

그런 다음 필요에 따라 구성하십시오.

관련 문제