2014-12-30 5 views
2

에서 인터페이스를 구현하는 열거 참조하십시오 :어떻게 이런 맥락에서 제네릭 클래스

enum Traits { 
    TA, 
    TB 
} 

interface Intrfc { 
    Traits getTraits(); 
} 

// How to add some precision about E which implements Traits? 
abstract class Base<E extends Enum<E>> { 

    void func(E e) { 
     final Traits t = ((Intrfc)e).getTraits(); //<<<<< To avoid this cast? 
    } 
} 

enum X implements Intrfc { 
    A(Traits.TA), 
    B(Traits.TA), 
    C(Traits.TB), 
    ; 
    private Traits traits; 

    X(Traits t) { 
     traits = t; 
    } 

    @Override 
    public Traits getTraits() { 
     return traits; 
    } 
} 

class Concrete extends Base<X> { 

    void f() { 
     func(X.B); 
    } 
} 

내가 E implements Traits으로 Base<E>E를 선언함으로써 캐스트를 피하는 소원을하지만 사용하는 구문을 알려져 있지 않습니다.

+0

'E는 열거를 확장 :

abstract class Base<E extends Intrfc> { 

여러 범위 (열거와 인터페이스 모두의 하위 유형)을 가지려면 : 그래서 당신은 다음을 수행 할 수있는 인터페이스의 하위 유형으로 유형 매개 변수를 선언합니다 & Intrfc'. –

답변

1

제네릭 컨텍스트의 extends 키워드는 일반 extends 또는 implements 의미를 모두 나타낼 수 있습니다.

abstract class Base<E extends Enum<E> & Intrfc> { 
+1

나는 OP가'enum '을 강요하고 싶어한다고 생각한다. –

+0

감사! 나는 1995 년부터 자바로 프로그램을했고이 문법은 본 적이 없다 ... – Aubin

+0

자바 코드에서는 흔히 발생하는 것이 아니기 때문에 [참고 링크가있다] (http://docs.oracle.com/javase/tutorial/java) /generics/bounded.html). – manouti