2014-01-26 1 views
1

상황 : 5 월 필드는 내가 관찰하고자하는 모델의 속성 일 수 있습니다 (PropertyChangeListener와 비슷한). Field는 Enum으로 정의됩니다. 전화하기를 원합니다enum-method의 일반 반환 유형

someModel.getField(Field f).addObserver(FieldObserver<Something> observer) 

옵저버의 유형 ("Something")은 필드에 따라 다르며 유형을 강제로 지정하고 싶습니다. 예를 들어 Field.FIRST_NAME이면 FieldObserver< String>이됩니다.

먼저 (작업) 방법 : 가 이미 대신 열거의 공공 정적 최종 필드 제네릭 클래스로 필드를 정의하여 도달 할 수있다. 내가 원하는 어떤 void addObserver(FieldObserver<? super E> observer)

이제 다음 줄은 컴파일 시간 오류가 발생, : 방법

public <E> Observable<E> getField(Field<? extends E> f) 

Observable<E>의 : 그래서 나는이 같은 유형의 안전을 강제하는 데 사용할 수있는 필드를 가지고 :

someModel.getField(Field.some_STRING_field).addObserver(INTEGERObserver) 

초 (아직 작동하지 않는) 방법 : 나도 같은 동작을 구현하기 위해 지금 노력하고 있어요 enum 클래스를 사용합니다. 나의 접근 방식 중 하나입니다 : 모든 종류의 (또한 올바른 일)의 FieldObserver를 추가하려고

public enum Field{ 
FIRST_NAME("firstName") { 
     @Override 
     public Observable<String> getObservable() { 
      return new Observable<String>(); 
     } 
    },... 

    //every Field must implement: 
    public abstract FieldObservable.Observable<?> getObservable();` 
} 

//getField(Field f) of the Model-class: 
public Observable<?> getField(Field f){ 
    return f.getObservable(); 
} 

나에게이 같은 컴파일시 에러 제공 :

addObserver을 (enumer.FieldObserver < 캡처 < ? >>) 관찰 가능한에서에 을 적용 할 수 없습니다 (enumer.FieldObserver < java.lang.String의>)

사람이 어떻게 열거-접근 작업을 만드는 방법을 말해 줄래? 또한 누군가가 접근법에 대한 더 나은 해결책이나 우려가 있다면, 나는 그것을 듣고 감사하게 될 것입니다.

답변

3

불행히도 enum은 일반적인 수 없습니다. enum 즉, Enum를 확장하는 일반적인 클래스이기 때문에 이것은 그 정의는 다음과 같습니다이다

class MyEnum<E extends Enum<E>> extends Enum<E extends Enum> {}

그래서 응용 프로그램 프로그래머가이 클래스에보다 일반적인 매개 변수를 추가 할 수 없습니다.

난 당신에게 다음과 같은 작업 방법을 제안 할 수 있습니다 :

  1. , 당신의 방법은 일반적인 예를 확인합니다. enum 레벨을 public <T> getField(Class<T> type)으로 정의하십시오. 각 열거 형 멤버에 대해이 메서드를 재정의합니다. 그런 다음 메서드의 모든 호출에서 형식을 제공 할 수 있습니다.
  2. 이 작업에는 enum을 사용하지 마십시오. public static 멤버 및 private 생성자를 사용하여 일반 클래스를 만듭니다. 열거 형 동작을 원한다면 자신의 정적 인 values()valueOf()을 구현하십시오.
+0

감사합니다 @AlexR. 케이스 1에 대한 예제를 제공해 주시겠습니까?나는 계속 "메소드가 슈퍼 클래스에서 메소드를 오버라이드하지 않는다"오류가 발생합니다. – husayt