Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 无法在Groovy中扩展泛型接口_Oop_Generics_Inheritance_Grails_Groovy - Fatal编程技术网

Oop 无法在Groovy中扩展泛型接口

Oop 无法在Groovy中扩展泛型接口,oop,generics,inheritance,grails,groovy,Oop,Generics,Inheritance,Grails,Groovy,我试图在groovy中实现一个名为ObjectPostProcessor接口的spring接口,以创建一个新类。 我尝试使用一个实现接口的新类以及创建一个新的匿名类来实现它。我一直看到一个错误的说法 Groovyc:在非抽象类中不能有抽象方法。 这使我认为Groovy不认为类的抽象方法正确地被重写。 下面是一个正在中断的代码示例 在groovy中实现这种接口的正确方法是什么 interface ObjectPostProcessor<T> { /** * Init

我试图在groovy中实现一个名为ObjectPostProcessor接口的spring接口,以创建一个新类。 我尝试使用一个实现接口的新类以及创建一个新的匿名类来实现它。我一直看到一个错误的说法

Groovyc:在非抽象类中不能有抽象方法。

这使我认为Groovy不认为类的抽象方法正确地被重写。

下面是一个正在中断的代码示例

在groovy中实现这种接口的正确方法是什么

interface ObjectPostProcessor<T> {

    /**
     * Initialize the object possibly returning a modified instance that should be used
     * instead.
     *
     * @param object the object to initialize
     * @return the initialized version of the object
     */
    public <O extends T> O postProcess(O object);
}

// groovy error Error:(15, 1) Groovyc: Can't have an abstract method in a non-abstract class. The class 'ObjectPostProcessorImpl' must be declared abstract or the method 'java.lang.Object postProcess(java.lang.Object)' must be implemented.
class ObjectPostProcessorImpl implements ObjectPostProcessor<Integer> {

    @Override
    public <O extends Integer> O postProcess(O object) {
        return object
    }
}

class Anon {
    public static void main(String[] args) {

        ObjectPostProcessor<Integer> objectPostProcessor  = new ObjectPostProcessor<Integer>() {

            /** Groovyc: Can't have an abstract method in a 
             * non-abstract class. 
             * The class 'ObjectPostProcessorImpl' must 
             * be declared abstract or the method 
             * 'java.lang.Object postProcess(java.lang.Object)' 
             * must be implemented. */

            @Override
            public <O extends Integer> O postProcess(O object) {
                return object;
            }
        };

        ObjectPostProcessorImpl objectPostProcessorImplObj = new ObjectPostProcessorImpl();

        System.out.println(objectPostProcessor.postProcess(12));
        System.out.println(objectPostProcessorImplObj.postProcess(12));
    }
}
接口对象后处理器{
/**
*初始化对象,可能返回应使用的已修改实例
*相反。
*
*@param object要初始化的对象
*@返回对象的初始化版本
*/
公共O后处理(O对象);
}
//groovy错误:(15,1)Groovyc:在非抽象类中不能有抽象方法。类“ObjectPostProcessorImpl”必须声明为抽象的,或者必须实现方法“java.lang.Object postProcess(java.lang.Object)”。
类ObjectPostProcessorImpl实现ObjectPostProcessor{
@凌驾
公共O后处理(O对象){
回波信号
}
}
类名{
公共静态void main(字符串[]args){
ObjectPostProcessor ObjectPostProcessor=新的ObjectPostProcessor(){
/**Groovyc:不能在一个
*非抽象类。
*类“ObjectPostProcessorImpl”必须
*被宣布为抽象或方法
*'java.lang.Object后处理(java.lang.Object)'
*必须加以实施*/
@凌驾
公共O后处理(O对象){
返回对象;
}
};
ObjectPostProcessorImpl objectPostProcessorImplObj=新的ObjectPostProcessorImpl();
System.out.println(objectPostProcessor.postProcess(12));
System.out.println(objectPostProcessorImplObj.postProcess(12));
}
}

您使用的是什么版本的Groovy?你试过忽略所有的泛型而只使用Object吗?这不是答案,而是一条出路:您可以将该文件重命名为.java(并调整内容)以继续。Groovyc委托给javac。如果你想做“groovy”的东西,你可以从impl内部调用它。@cfrick,我试着忽略所有泛型,只使用object。这不起作用,因为编译器希望返回类型是某个O,它是Integer的子类。因为对象不符合那个标准,所以我们得到一个错误。将文件重命名为Java是可行的,因为这是有效的Java代码。我试图理解为什么它永远不能与groovy一起工作。您是在SoapUI中作为groovy脚本运行的吗?如果是,那么SoapUI将与它自己的JRE捆绑在一起。这可能解释了为什么相同的代码可以作为java文件工作,并且在Groovy中存在错误。您可以尝试更新SOAPUI_HOME/bin/SOAPUI.bat以指向您的系统JRE,而不是绑定的JRE。希望对你有帮助。