2014-12-30 3 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 в Base<E> с E implements Traits, но я не знал синтаксис для использования.

+0

'E проходит Enum & Intrfc'. –

ответ

1

Ключевое слово extends в контексте дженериков может представлять как нормальные значения extends, так и значения implements. Таким образом, чтобы объявить тип параметра как подтип интерфейса вы можете сделать следующее:

abstract class Base<E extends Intrfc> { 

Чтобы иметь несколько оценок (подтип как перечисление и интерфейс):

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

Я думаю, что OP хочет заставить «enum» тоже. –

+0

Спасибо! Я программирую с Java с 1995 года, и я никогда не видел этот синтаксис ... – Aubin

+0

Возможно, потому, что это не часто встречается в Java-коде, но [здесь ссылка ссылки] (http://docs.oracle.com/javase/tutorial/java /generics/bounded.html). – manouti

Смежные вопросы