我正在尝试通过使用接口定义一些基本的访问方法来对不同的Enum类进行多态访问。例如:
package com.company;
public interface StatesInterface<E extends Enum<E>> {
E getOneState();
E getTwoState();
E getThreeState();
}
和一些实现:
package com.company;
public enum States implements StatesInterface<States> {
ONE, TWO, THREE, FOUR;
@Override
public States getOneState() {
return ONE;
}
@Override
public States getTwoState() {
return TWO;
}
@Override
public States getThreeState() {
return THREE;
}
}
注意:我知道这段代码有问题,因为接口通过非静态接口提供了静态枚举值,但是我不知道如何解决它。
当我尝试使用此接口作为类中的类型约束时,出现类型错误。例如:
package com.company;
public class Lifecycle<S extends StatesInterface> {
private S state;
public void transit() {
state = state.getOneState(); // <---- incompatible types
}
}
在这种情况下,我无法将state.getOneState();
类型的Enum
分配给state
类型的StatesInterface<Enum>
。
当我尝试将通用类型更改为Lifecycle<S extends StatesInterface<S>>
时,编译会说Error:(3, 50) java: type argument S is not within bounds of type-variable E
。
我的目标是创建一组具有通用接口的不同Enum类,以创建一个将类Lifecycle
概括为特定Enum类型的新类。
是否可以使用提供的代码来实现此目的以及如何解决?
答案 0 :(得分:1)
我认为您正在寻找的是这个
class Lifecycle<S extends Enum<S> & StatesInterface<S>>
相比之下,您的定义如下:
interface StatesInterface<E extends Enum<E>>
enum States implements StatesInterface<States>
class Lifecycle<S extends StatesInterface>
然后,getOneState()
仅返回类型Object extends Enum<Object>
,因为您通过给StatesInterface
使用原始类型来提供类型参数,这是不兼容的类型为S extends StatesInterface
,从而为您提供"Type mismatch: cannot convert from Enum to S"
通过将您的定义更改为class Lifecycle<S extends Enum<S> & StatesInterface<S>>
,您可以允许getOneState()
返回S extends Enum<S> & StatesInterface<S>
,它当然兼容,可以设置为S
类型的变量,{{1} }
从中学到什么
您应该strive to avoid using raw types,因为它们放弃了泛型的类型安全性,而且就像您在这里遇到的那样,通常也不会与其他泛型很好地配合。