【发布时间】:2017-01-13 18:55:44
【问题描述】:
我有一个接口Moded。方法是getMode()、setMode( Enum<?> mode )。
它还有一个方法getMode( Object key ),用于在实现类有多种模式时识别“模式类型”(例如OPEN/CLOSED是一种状态,而COMMAND_MODE/QUERY_MODE/OTHER_MODE是另一种状态,即模式的“二维”)。
然后,实现类将使用enums 来提供每种模式类型的可能值。
这个想法是 getMode( Object key ) 被传递一个键,实现类使用该键来识别模式类型以查找其值。但是为了使这个更好,如果您总是必须使用Enum 类对象作为键,那将是理想的。无论如何你都可以这样做,但为了强制执行,我尝试更改为 getMode( Class<Enum<?>> key )。
出于某种原因,假设我有一个实现Moded 的类IndexManager,它包含一个enum,如下所示:
enum MANAGER_MODE {
COMMAND_MODE, QUERY_MODE, OTHER_MODE
}
我实现的方法看起来像这样:
@Override
public Enum<?> getMode(Class<Enum<?>> key ) throws Exception {
if( key.equals( IndexManager.MANAGER_MODE.class )){
return managerMode;
}
...
...然后我试试这个:
indexManager.getMode( IndexManager.MANAGER_MODE.class )
我在 Eclipse 中收到一条消息
The method getMode(Class<Enum<?>>) in the type IndexManager is not applicable for the arguments (Class<IndexManager.MANAGER_MODE>)
然而这说的是“真的”:
String.format( "extends Enum? %s", Enum.class.isAssignableFrom( IndexManager.INDEX_MANAGER_MODE.class ))
稍后
事实上 Andreas 的答案更好(没有强制转换;如果需要,类型安全)。用他的方法你把
<T extends Enum<T>> T getMode(Class<T> key )
允许实现多模式类
和
<T extends Enum<T>> T getMode()
允许实现单模式类
【问题讨论】:
标签: java enums parameterized