【问题标题】:Passing Enum.class as a parameter?将 Enum.class 作为参数传递?
【发布时间】: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&lt;Enum&lt;?&gt;&gt;) in the type IndexManager is not applicable for the arguments (Class&lt;IndexManager.MANAGER_MODE&gt;)

然而这说的是“真的”:

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


    【解决方案1】:

    改用getMode(Class&lt;? extends Enum&gt; key)

    【讨论】:

    • 先生/女士,您是参数化的天才。我向你脱帽致敬。实际上,我将getMode( Class&lt;? extends Enum&lt;?&gt;&gt; key ) 放入以避免有关“原始类型”的消息。
    • @mikerodent 对此的解释,请参阅stackoverflow.com/questions/2745265/…
    • @VGR Tx - 将学习 - 我之前可能已经读过这方面的内容,但是这种不是特别常见的参数化东西往往会在我的耳朵里进入另一只耳朵。
    【解决方案2】:

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

    例如如果你想支持这个电话:

    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 必须被参数化:Moded&lt;T extends Enum&lt;?&gt;&gt;?但鉴于Moded 可以引用多个Enum 类,这是行不通的。否则你能告诉我接口方法的外观和实现类方法的外观(没有编译器投诉)吗?
    • 这不是我已经做过的吗?展示如何实现getMode()
    • 不需要未经检查的操作。你可以改用return key.cast(managerMode);
    猜你喜欢
    • 2019-03-26
    • 2020-09-18
    • 2015-05-24
    • 2012-11-10
    • 2020-10-30
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多