当前位置: 首页 > 面试题库 >

Java Enum作为Enum中的泛型类型

霍锦
2023-03-14
问题内容

我正在尝试在一个抽象类中创建一个抽象方法,该抽象类将自己的Enum作为参数。但是我也希望枚举是通用的。

所以我这样宣布:

public abstract <T extends Enum<T>> void test(Enum<T> command);

在实现中,我列举了一个枚举:

public enum PerspectiveCommands {
    PERSPECTIVE
}

并且方法声明变为:

@Override
public <PerspectiveCommands extends Enum<PerspectiveCommands>> void test(Enum<PerspectiveCommands> command) {

}

但是,如果我这样做:

@Override
public <PerspectiveCommands extends Enum<PerspectiveCommands>> void test(Enum<PerspectiveCommands> command) {
    if(command == PerspectiveCommands.PERSPECTIVE){
        //do something
    }
}

我无法访问PerspectiveCommands.PERSPECTIVE并显示错误消息

cannot find symbol symbol: variable PERSPECTIVE   location: class Enum<PerspectiveCommands> where PerspectiveCommands is a type-variable: PerspectiveCommands extends Enum<PerspectiveCommands> declared in method <PerspectiveCommands>test(Enum<PerspectiveCommands>)

我做了这样的解决方法:

public <T extends Enum<T>> byte[] executeCommand(Enum<T> command) throws Exception{
    return executeCommand(command.name());
}

@Override
protected byte[] executeCommand(String e) throws Exception{
    switch(PerspectiveCommands.valueOf(e)){
        case PERSPECTIVE:
            return executeCommand(getPerspectiveCommandArray());
        default:
            return null;
    }
}

但是我想知道是否有可能无法通过我的解决方法?


问题答案:

在您的方法实现PerspectiveCommands中,不是枚举,而是类型参数(通常称为)T。因此,它掩盖了与已经说过的axtavt相同名称的枚举,因此PERSPECTIVE在此未知。

您的抽象方法声明很好,但是您可以使用稍微不同的方法。

public void test(PerspectiveCommands command)将不起作用,因为此方法不会覆盖通用版本。原因是使用通用版本时,可从参数中推断类型,因此您可以传递任何枚举。

但是,我假设您有一个定义抽象方法的接口或抽象类。所以尝试这样的事情:

interface TestInterface<T extends Enum<T>>
{
  public abstract void test(T command);
}

class TestImpl implements TestInterface<PerspectiveCommands>
{
  @Override
  public void test(PerspectiveCommands command) {
    if(command == PerspectiveCommands.PERSPECTIVE){
        //do something
    }
  }
}


 类似资料:
  • 我在我的Java程序中写了这个函数: 这就是我所说的: 它是有效的,但我觉得我应该能够省略第一个参数,并从返回类型(结果被分配到的类型)推断出它。这可能吗?如果是,语法是什么?

  • 问题内容: 您认为可以创建类似的东西吗? 问题答案: 是的你可以。 用法示例:

  • 我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误:

  • 问题内容: 我上课了。我怎么能说我想成为某个班级的实施者?编写根本无法编译。 问题答案: 使用代替。

  • 问题内容: 我正在开发Java企业应用程序,当前正在执行Java EE安全性工作,以限制对特定用户的特定功能的访问。我配置了应用程序服务器以及所有内容,现在使用RolesAllowed注释保护方法的安全: 当我使用这样的注释时,它可以正常工作: 但这不是我想要的,因为我必须在这里使用String,因此重构变得很困难,并且可能会出现拼写错误。因此,我想使用一个Enum值作为此注释的参数,而不是使用S

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符