重写抽象枚举方法

发布于 2024-11-09 12:41:00 字数 587 浏览 0 评论 0原文

以下是有效的 Java 代码:

enum ProductType {
  CASH_BONUS { 

     void doSomething() {}    
  },

  CUSTOMIZABLE { 
     void doSomething() {}    
  }

  abstract void doSomething()
}

但是当我尝试在 Groovy 控制台中运行它时,出现错误:

a 中不能有抽象方法 非抽象类。班级 必须声明“产品类型” 抽象或方法“void” doSomething()' 必须被实现。 位于行:-1,列:-1

a 中不能有抽象方法 非抽象类。班级 必须声明“产品类型” 抽象或方法“void” doSomething()' 不能是抽象的。 位于第 11 行,第 3 列

我似乎记得读过Groovy(尚)不支持枚举常量的重写方法,这是正确的吗?如果是,是否有一种优雅的方法来模拟这种行为?

更新

这是一个在 Groovy 1.8.0 左右修复的错误

The following is valid Java code:

enum ProductType {
  CASH_BONUS { 

     void doSomething() {}    
  },

  CUSTOMIZABLE { 
     void doSomething() {}    
  }

  abstract void doSomething()
}

But when I try to run this in the Groovy console, I get the errors:

Can't have an abstract method in a
non-abstract class. The class
'ProductType' must be declared
abstract or the method 'void
doSomething()' must be implemented.
at line: -1, column: -1

Can't have an abstract method in a
non-abstract class. The class
'ProductType' must be declared
abstract or the method 'void
doSomething()' must not be abstract.
at line: 11, column: 3

I seem to recall reading that Groovy does not (yet) support overriding methods for enum constants, is this correct, and if so, is there an elegant way to emulate this behavior?

Update

This was a bug that was fixed some time around Groovy 1.8.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

没有伤那来痛 2024-11-16 12:41:00

这是一个错误: http://jira.codehaus.org/browse/GROOVY-4641

你可以使抽象方法变得不抽象。抛出异常以确保您始终覆盖它,例如:

enum ProductType {
    CASH_BONUS(1) {
        void doSomething() {
        }
    },
    CUSTOMIZABLE(2) {
        void doSomething() {
        }
    };
    ProductType(int n) {
        this.n=n;
    }
    final int n;
    void doSomething() {
        throw new UnsupportedOperationException()
    }
}

ProductType.CASH_BONUS.doSomething();
ProductType.CUSTOMIZABLE.doSomething();

it's a bug: http://jira.codehaus.org/browse/GROOVY-4641

you can make the abstract method not abstract. throw an exception to make sure you always override it like:

enum ProductType {
    CASH_BONUS(1) {
        void doSomething() {
        }
    },
    CUSTOMIZABLE(2) {
        void doSomething() {
        }
    };
    ProductType(int n) {
        this.n=n;
    }
    final int n;
    void doSomething() {
        throw new UnsupportedOperationException()
    }
}

ProductType.CASH_BONUS.doSomething();
ProductType.CUSTOMIZABLE.doSomething();
dawn曙光 2024-11-16 12:41:00

在 Eclipse 中将 Groovy Compile 从 1.8 更新到 2.0 对我有用

(Eclipse 3.7)

Update the Groovy Compile from 1.8 to 2.0 in eclipse worked for me

(Eclipse 3.7)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文