在Groovy类中实现Java接口

6

我刚开始学习Groovy编程。

我注意到了一种奇怪的行为,但无法找到任何解释。

我创建了一个Java接口TestInterface.java。

public interface TestInterface {

    public void m1();

}

我创建了一个名为TestG.groovy的Groovy类

class TestG implements TestInterface {

}

我创建了一个Java类TestJ.java

public class TestJ implements TestInterface{

    @Override
    public void m1() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    } 
}

我的问题在于TestG中,为什么我没有得到任何错误提示来实现抽象方法或将类声明为抽象。

Java和Groovy有什么不同之处,因为我需要在Java中实现抽象方法或将类声明为抽象,但在Groovy中不需要。


2
在非抽象类中不能有抽象方法。类“TestG”必须声明为抽象类或实现方法“void m1()”。这是运行您的代码时出现的错误。在这方面,与Java没有区别。 - cfrick
1
从我过度使用IntelliJ的经验来看,对于每种单一语言(除了Java可能),它都会显示虚假的错误并隐藏真正的错误。我敢打赌其他所有IDE都是一样的。如果你认为这是NetBeans(或Groovy插件)的问题,你应该联系维护者,提交bug等。 - cfrick
3
澄清一些事情。Groovy有自己的编译器,JVM禁止具有抽象方法的非抽象类,因此Groovy编译器必须报错,否则JVM将不允许通过验证。groovy-eclipse编译器是groovy编译器和JDT之间的混合体。但是JDT对除Java之外的任何内容都不太开放,开发人员也不想过多地烦恼其他语言。这意味着集成很困难,但如果没有这个,您将无法获得例如重构等功能。 - blackdrag
Java代码在Eclipse+Groovy扩展中(错误)List<int> ll = null; -> "插入维度以完成引用类型。将其转换为Groovy并在Groovy编辑器中打开" - Jacek Cz
我使用JetBrains IntelliJ IDE社区版,它对于Java和Groovy源代码的项目要好得多,并且如果未将方法添加为其他成员所述,则会对TestG Groovy类发出错误警告。 - Rao
显示剩余6条评论
1个回答

11

我知道这个问题已经存在一段时间并且已经在上面得到了回答,但我觉得有必要补充一下。

class TestG implements TestInterface {}

这仍然是“Java”的做事方式。使用Groovy基本上消除了实现接口的需要(除了作为标记接口之外)

在Groovy中,您只需要这样做:

def myObject = [m1: {-> doSomething()}] as TestInterface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接