私はGroovyで微少なモデルを構築しようとしていますが、GroovyがGroovy Beanのコンストラクタでnull値を処理しているという問題を抱えています。要するにGroovy Beansの標準コンストラクタはnull値をどのように処理できますか?
計算結果の一つは、私が調査データが不足して最良の表現だろうと思ったかである、nullの場合、constructor method that Groovy offers
new Person(nrLegs:calculationResult1, nrArms:calculationResult2)
はIllegalArgumentException
をスローします。
これは私には変わったようです。変数double age;
を値なしで定義すると、明らかにnullに設定されます。
double testDouble;
assert testDouble == null; // no Problem
私はGroovyの豆と同じことを行う場合、それは例えば、0.0の値があります。その後、
class Person {
double age;
int nrLegs, nrArms;
}
Person testPerson = new Person(nrArms:calculationResult1)
assert testPerson.age == null; // Assertion failed. testPerson.age == 0.0
さらに、私が使用してnullにプロパティを設定することはできませんGroovyの構文:
Person testPerson = new Person(nrArms:calculationResult1)
testPerson.age = null; // IllegalArgumentException
これはまさに上記の問題と同じようです。
なぜGroovyはnull値を割り当てることを禁じますか?
ありがとうございました!
を編集してください。参考のため、ここにはthe entire Person classとStackTraceがあります。
変数の型を 'int'から' Integer'に変更すると本当に問題が解決します。ありがとう!しかし、それは**なぜ**の質問を提起しますか?まず、[Groovyには基本データ型がありません](http://www.vogella.de/articles/Groovy/article.html#datatypes)。第2に、私が提供した最初の例のように、 "原始"データ型( 'double'など)は、Groovyでnullに設定できます。これはバグですか? – mzuba
Groovyにはプリミティブ型がありませんが、PersonクラスJavaではありませんか?(私はファイルサフィックスを見ずにはわかりません - それは '.java'ですか? - それは確かにJavaのようです)。 Groovyは自動的に 'unboxing'(オブジェクトとプリミティブ型の間の変換)によってコンパイルされたJavaクラスと相互運用する必要があります。元のIllegalArgumentExceptionを引き起こしていたのがこのアンボックスです。 'Person'クラスがjavaではなくgroovyとしてコンパイルされていることを確認することで、これを避けることができます。 – winstaan74
ファイル拡張子は '.java'ではなく' .groovy'です。私はそれがGroovyとしてコンパイルされているかどうかはわかりませんが、そうでなければ 'new Person(age:xyz、nrCond:xyz) 'というメソッドがうまくいきません。 – mzuba