从这个背景来看:
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 :(得分:1)
泛型上下文中的extends
关键字可以表示正常的extends
或implements
含义。因此,要将type参数声明为接口的子类型,您可以执行以下操作:
abstract class Base<E extends Intrfc> {
要有多个边界(枚举和接口的子类型):
abstract class Base<E extends Enum<E> & Intrfc> {