2013-10-11 36 views
4

這裏是腳本(Scccc.groovy):Groovy腳本可以從Java或Groovy超類繼承嗎?

import scriptParents.ScriptGroovyParent 

println(queryThisBaby("my query")); 

,這裏是超:

class ScriptGroovyParent { 

    public ScriptGroovyParent() { 
     // TODO Auto-generated constructor stub 
    } 

// public String queryThisBaby(String query){ 
//  
//  return query +" was run."; 
// } 

    def queryThisBaby(name) { 
     return name +" was run." 
    } 
} 

我得到不過嘗試運行該腳本時出錯。

Caught: groovy.lang.MissingMethodException: No signature of method: scripts.Scccc.queryThisBaby() is applicable for argument types: (java.lang.String) values: [my query] 
groovy.lang.MissingMethodException: No signature of method: scripts.Scccc.queryThisBaby() is applicable for argument types: (java.lang.String) values: [my query] 
    at scripts.Scccc.run(Scccc.groovy:5) 

這是怎麼回事?

回答

3

腳本可以使用CompilerConfiguration擴展基類。這裏需要注意的是,基類必須擴展Script,因爲groovy腳本通常會擴展腳本,並且在「IS A」關係中不能有多重繼承。

//ScriptGroovyParent.groovy 
abstract class ScriptGroovyParent extends Script{ 
    def queryThisBaby(name) { 
     return name +" was run." 
    } 
} 


//Script Scccc.groovy 
import org.codehaus.groovy.control.CompilerConfiguration 

def configuration = new CompilerConfiguration() 
configuration.setScriptBaseClass("ScriptGroovyParent") 

def shell = new GroovyShell(this.class.classLoader, new Binding(), configuration) 

assert shell.evaluate("queryThisBaby('My Query')") == 'My Query was run.' 

如果軟件包都位於不同的軟件包中,則可以導入軟件包。

+0

謝謝,但@Override \t public Object run(){ \t \t return null; \t}方法。 –

+1

在腳本中被重寫。在上面的例子中創建shell並評估表達式的腳本(通常是一個groovy腳本)將始終可運行,並在Script的run()下運行。如果你想確保它總是按照這種方式完成,而不是從父項開始,那麼比'abstract''聲明'ScriptGroovyParent'要好。 @AlexMills – dmahapatro