将 Enum.class 作为参数传递?
Passing Enum.class as a parameter?
我有一个接口 Moded
。方法是 getMode()
、setMode( Enum<?> mode )
。
它还有一个方法getMode( Object key )
,用于识别"mode type"在实现classes时有多个模式(例如OPEN/CLOSED是一个状态,但 COMMAND_MODE/QUERY_MODE/OTHER_MODE 是另一种状态,即模式的“二维”)。
实施 classes 然后将使用 enums
提供每种模式类型的可能值。
想法是向 getMode( Object key )
传递一个键,实现 class 使用该键来识别模式类型以查找其值。但是为了使它更好,如果您总是必须使用 Enum
class 对象作为键,那将是理想的。无论如何你都可以这样做,但为了强制执行它,我尝试更改为 getMode( Class<Enum<?>> key )
.
出于某种原因,假设我有一个实现 Moded
的 class 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>)
然而这表示 "true":
String.format( "extends Enum? %s", Enum.class.isAssignableFrom( IndexManager.INDEX_MANAGER_MODE.class ))
以后
事实上,Andreas 的回答更好(没有转换;如果需要,类型安全)。使用他的方法,您将
<T extends Enum<T>> T getMode(Class<T> key )
允许实现多模式classes
和
<T extends Enum<T>> T getMode()
允许实施单模classes
试试 getMode(Class<? extends Enum> key)
。
要允许调用者将 return 值分配给给定类型的变量,您需要将通配符替换为模板参数。
例如如果你想支持这个电话:
MANAGER_MODE mode = indexManager.getMode( MANAGER_MODE.class );
那么你的方法需要是这样的:
@SuppressWarnings("unchecked")
public <T extends Enum<T>> T getMode(Class<T> key) {
if (key == MANAGER_MODE.class)
return (T) managerMode;
throw new IllegalArgumentException("Unknown mode type: " + key.getName());
}
我有一个接口 Moded
。方法是 getMode()
、setMode( Enum<?> mode )
。
它还有一个方法getMode( Object key )
,用于识别"mode type"在实现classes时有多个模式(例如OPEN/CLOSED是一个状态,但 COMMAND_MODE/QUERY_MODE/OTHER_MODE 是另一种状态,即模式的“二维”)。
实施 classes 然后将使用 enums
提供每种模式类型的可能值。
想法是向 getMode( Object key )
传递一个键,实现 class 使用该键来识别模式类型以查找其值。但是为了使它更好,如果您总是必须使用 Enum
class 对象作为键,那将是理想的。无论如何你都可以这样做,但为了强制执行它,我尝试更改为 getMode( Class<Enum<?>> key )
.
出于某种原因,假设我有一个实现 Moded
的 class 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>)
然而这表示 "true":
String.format( "extends Enum? %s", Enum.class.isAssignableFrom( IndexManager.INDEX_MANAGER_MODE.class ))
以后
事实上,Andreas 的回答更好(没有转换;如果需要,类型安全)。使用他的方法,您将
<T extends Enum<T>> T getMode(Class<T> key )
允许实现多模式classes
和
<T extends Enum<T>> T getMode()
允许实施单模classes
试试 getMode(Class<? extends Enum> key)
。
要允许调用者将 return 值分配给给定类型的变量,您需要将通配符替换为模板参数。
例如如果你想支持这个电话:
MANAGER_MODE mode = indexManager.getMode( MANAGER_MODE.class );
那么你的方法需要是这样的:
@SuppressWarnings("unchecked")
public <T extends Enum<T>> T getMode(Class<T> key) {
if (key == MANAGER_MODE.class)
return (T) managerMode;
throw new IllegalArgumentException("Unknown mode type: " + key.getName());
}