【问题标题】:Java nested enum understandingJava嵌套枚举理解
【发布时间】:2018-09-03 12:49:46
【问题描述】:

我想问一下嵌套枚举。我正在使用旧代码,我发现我不太了解的非常奇怪的结构。

我有这个枚举:

public enum DbEngines {
ORACLE("oracle", "set define on", "set define off")
, POSTGRESQL("postgresql", "--TODO set define on", "--TODO set define off");

private final String dbEngine;
private String setOn;
private String setOff;

DbEngines(String dbEngine, String setOn, String setOff) {
    this.dbEngine = dbEngine;
    this.setOn = setOn;
    this.setOff = setOff;
}

public String getSetOn() {
    return setOn;
}

public String getSetOff() {
    return setOff;
}

public String toString() {
    return this.dbEngine;
}
}

我在这个枚举中添加了私有字符串,它是特定于引擎的,所以这里对我来说是个好地方。问题是,在方法声明的某些地方我看到类似的东西

public someMethod(Enum<DbEngines> engine, ...)

并且它在没有方法的情况下完美地工作,但是现在,在改变之后,我不能调用这个枚举的公共 getter。但如果我改为:

public someMethod(DbEngines engine, ...)

它对所有公共吸气剂都没有任何问题。也许有人可以解释一下?

【问题讨论】:

  • 这真的与你的改变无关。如果您尝试使用超类引用调用类型的非覆盖公共方法,则会收到错误消息。
  • @RealSkeptic 是的,这是真的,但也许你可以解释一下这个转换为 Eum 会发生什么
  • Enum 是一个抽象类。 DbEnginesEnum 的子类。由于新方法是在 DbEngines 类型上定义的,因此它们仅在使用此类型时可见,而不是 DbEngines 的超类 Enum

标签: java enums nested


【解决方案1】:

Enum 在 Java 中是所有枚举类型的基类。可以认为它类似于 Object 类。

就像使用 Object 类型的引用可以持有任何类的对象的引用一样,可以使用 Enum 类型的引用来引用枚举类型。

Object o = new Integer(10);
Enum e = DBEngine.ORACLE;

不能使用超类的引用调用继承类中存在但超类中不存在的方法。

here的类似解释。

【讨论】:

  • 注意 - Enum 是一个泛型类型。请不要使用原始类型,这是一种不好的做法。
  • @RealSkeptic 和 Dhruvil Vaghela 感谢您的解释
  • @RealSkeptic 我的错。这是我能想到的最快的例子。
猜你喜欢
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多