2016-11-10 82 views
0

我來自Java背景,我的Groovy技巧仍然非常小...沒有方法的簽名:com.foo.D.doSomething()適用於參數類型:(com.foo.C)

我已在Java中以下:

  • 接口A
  • C器具A
  • D類,其具有一個接受的A實例的方法:doSomething(A a)

而下面的Groovy代碼:

import com.foo.A 

def c = new C() 

assert c instanceof com.foo.A 

def d = new D() 
d.doSomething(c);  

return true; 

首先,所有的assert失敗:

java.lang.ClassCastException: D1_groovyProxy cannot be cast to com.foo.A 

如果我註釋掉assert,我得到

No signature of method: com.foo.D.doSomething() is applicable for argument types: (com.foo.C) values: [blah blah] 

Possible solutions: doSomething(com.foo.A) 

我也試過定義:

def c = new C() as C 

...但我仍然收到上面提到的ClassCastException

我使用:

<dependency> 
    <groupId>org.codehaus.groovy</groupId> 
    <artifactId>groovy-all</artifactId> 
    <version>2.4.7</version> 
</dependency> 

請幫幫忙,因爲這已經讓我的精神現在小時...

+0

你不能做'new'的*接口*。 Groovy會失敗,並顯示*「您無法從抽象界面創建實例」* – Andreas

+0

@Andreas:道歉,我在示例中犯了一個錯誤。我糾正了它。它不是'A',而是'C'。 – carlspring

+1

無法使用帶有腳本的GroovyConsole 2.3.10複製,除了固定的導入。 – Andreas

回答

1

使用你的問題在groovyConsole創建下面的示例代碼。它工作得很好。

package com.foo 
interface A { 
    void doThat() 
} 

class C implements com.foo.A { 
    void doThat() { println "doing that"} 
} 

class D { 
    void doSomething(com.foo.A obj) {  
    println "doing something.." 
    obj.doThat() 
    } 
} 

def c = new C() 

assert c instanceof com.foo.A 

def d = new D() 
d.doSomething(c) 

輸出:

做的事情..
這樣做

相關問題