Java 열거 형은 훌륭합니다. 제네릭도 마찬가지입니다. 물론 우리는 유형 삭제로 인해 후자의 한계를 알고 있습니다. 그러나 이해할 수없는 한 가지가 있습니다. 왜 이런 식으로 열거 형을 만들 수 없습니까?
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
이 제네릭 형식 매개 변수 <T>는 여러 곳에서 유용 할 수 있습니다. 메소드에 일반 유형 매개 변수를 상상해보십시오.
public <T> T getValue(MyEnum<T> param);
또는 열거 형 클래스 자체에서도 :
public T convert(Object o);
보다 구체적인 예 # 1
위의 예는 일부에서는 너무 추상적으로 보일 수 있으므로 여기에 내가 원하는 이유에 대한 더 실제적인 예가 있습니다. 이 예에서는 사용하고 싶습니다
- 열거 형, 유한 속성 키 집합을 열거 할 수 있기 때문에
- 제네릭 (Generics) : 속성 저장을위한 메서드 수준 형식 안전성을 가질 수 있기 때문에
public interface MyProperties {
public <T> void put(MyEnum<T> key, T value);
public <T> T get(MyEnum<T> key);
}
보다 구체적인 예 # 2
데이터 유형 열거가 있습니다.
public interface DataType<T> {}
public enum SQLDataType<T> implements DataType<T> {
TINYINT<Byte>,
SMALLINT<Short>,
INT<Integer>,
BIGINT<Long>,
CLOB<String>,
VARCHAR<String>,
...
}
각 열거 형 리터럴에는 분명히 제네릭 형식을 기반으로 추가 속성이 있습니다. <T> 을 갖는 동시에 열거 형 (불변, 단일 톤, 열거 가능 등)입니다.
질문:
아무도 이것을 생각하지 않았습니까? 이것이 컴파일러 관련 제한입니까? 사실 키워드 " enum "이 JVM에 생성 된 코드를 나타내는 구문 설탕으로 구현 된다는 점을 고려하면 이 제한을 이해하지 못합니다.
누가 나에게 설명 할 수 있습니까? 대답하기 전에 다음을 고려하십시오.
- 일반 유형이 지워지는 것을 알고 있습니다 :-)
- Class 객체를 사용하는 해결 방법이 있다는 것을 알고 있습니다. 그들은 해결 방법입니다.
- 제네릭 형식은 해당되는 경우 (예 : convert () 메서드 호출시) 컴파일러 생성 형식 캐스트를 생성합니다.
- 제네릭 형식 <T>는 열거 형에 있습니다. 따라서 열거 형의 각 리터럴에 바인딩됩니다. 따라서 컴파일러는 다음과 같은 내용을 작성할 때 적용 할 유형을 알고 있습니다.
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject); T getvalue()메소드 의 일반 유형 매개 변수에도 동일하게 적용됩니다 . 컴파일러는 호출 할 때 타입 캐스팅을 적용 할 수 있습니다String string = someClass.getValue(LITERAL1)
enumJava 1.5 이전에 사용했던 "typesafe enum"관용구로 바꾸십시오 . 갑자기 열거 형 멤버를 매개 변수화 할 수 있습니다. 아마도 내가 지금 할 것입니다.