将Enum.class作为参数传递?

时间:2017-01-13 18:55:45

标签: java enums parameterized

我有一个界面Moded。方法是getMode()setMode( Enum<?> mode )

它还有一个方法getMode( Object key ),用于在具有多种模式时实现类中的“模式类型”(例如,OPEN / CLOSED是一种状态,但COMMAND_MODE / QUERY_MODE / OTHER_MODE是另一种状态,即模式的“2维”。

然后,实现类将使用enums来提供每种模式类型的可能值。

这个想法是getMode( Object key )传递一个键,实现类用它来识别模式类型以找到值。但是为了使这个更好,如果你总是必须使用Enum类对象作为键,那将是理想的。你无论如何都可以这样做,但为了强制执行,我尝试改为getMode( Class<Enum<?>> key )

出于某种原因,我说我有一个实现IndexManager的课程Moded,它包含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 ))

后来

事实上,安德烈亚斯的答案更好(没有铸造;如果需要,可以输入安全性)。使用他的方法,你把

<T extends Enum<T>> T getMode(Class<T> key ) 

允许实现多模式类

<T extends Enum<T>> T getMode()

允许实现单模式类

2 个答案:

答案 0 :(得分:2)

请尝试getMode(Class<? extends Enum> key)

答案 1 :(得分:1)

要允许调用者将返回值赋给给定类型的变量,您需要使用模板参数替换通配符。

E.g。如果你想支持这个电话:

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());
}