2016-04-06 7 views
3

で失敗:パラメータ場合、のGroovy - DEFのパラメータを持つメソッドを呼び出すと、私はこのGroovyのメソッドの呼び出しが期待どおりに動作理由として説明を取得するために期待しています「不正なクラス名」

def f1(int n) { 
    return n + 1 
} 
println f1(1) // -> 2 

しかし、 (具体的に「DEF N」の代わりに「int型のn」の)定義されていない、メソッド呼び出しを変更する必要がある:?

def f2(def n) { 
    return n + 1 
} 
println f2(1) // Exception: Illegal class name 
println this.&f2(1) // -> 2 

これが必要にするためにボンネットの下に何が起こっている

詳細で更新:

これは、スクリプト全体が1.groovyと呼ばれるファイル内の9行でのGroovy 2.4.5 JVM 1.8.0_51

とWindows上で - 何もありません。

私は、 "グルーヴィー1.groovy"

ライン8上の誤りがある使用して、コンソール(CMDR)からこれを実行しています:

キャッチ:ます。java.lang.ClassFormatError:不正なクラス名「3 $を3.runで3 $ f2の 3 $ f2の "クラスファイル内(3.groovy:8):不正なクラス名クラス・ファイル内の3 $ f2の ます。java.lang.ClassFormatError" F2"

+0

'def f3(n){...'?これはGroovyのどのバージョンですか? – doelleri

+0

'f2(1)'はうまく動作します。メソッドparamsにdefを追加することは全く必要ないことに注意してください。 –

+0

私はあなたの例で問題はなく、GroovyのWebコンソールまたはJavaアプリケーションでテストしました。これは恐らくあなたがここに示していない文脈に関係しているでしょう –

答えて

10

これが関連しますあなたのスクリプトの名前。ファイル "1.groovy"を持っている場合、Groovyはデフォルトパッケージに "1"という名前のクラスを生成します。これは有効なクラス名ではありません。

この方法は、「一般的すぎる」であるとして、あなたは、タイプなしf2(n)を使用すると、Groovyのは、マッチング方法、またはf2という名前のクラス、またはF2という名前の内部クラスを探してみてください:クラスの内部クラスf2をロードします1が無効です。名前が無効です。

+0

優秀 - それだけです!ファイルは実際に3.groovyと呼ばれましたが、エラーメッセージ –

+0

を理解しました。この問題を回避する別の方法は、メソッドを有効な名前のクラスにラップすることです。 – cmcginty

+0

ダッシュ " - "も許可されていません。 – papaiatis

関連する問題