Reputation: 18597
I'm following this blog post about using Lists and Maps as Constructors.
Why does following list fail to coerce to object?
class Test {
static class TestObject {
private int a = 1;
protected int b = 2;
public int c = 3;
int d = 4;
String s = "s";
}
static main(args) {
def obj = [1, 2, 3, 4, 's'] as TestObject
}
}
I get this exception:
Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[1, 2, 3, 4, s]' with class 'java.util.ArrayList' to class 'in.ksharma.Test$TestObject' due to: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: in.ksharma.Test$TestObject(java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.String)
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '[1, 2, 3, 4, s]' with class 'java.util.ArrayList' to class 'in.ksharma.Test$TestObject' due to: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: in.ksharma.Test$TestObject(java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.String)
at in.ksharma.Test.main(Test.groovy:22)
Upvotes: 4
Views: 2052
Reputation: 50245
If you plan to use map instead, here is something as well (without using as
) which can be implemented:
class TestObject {
private int a = 1
protected int b = 2
public int c = 3
int d = 4
String s = "s"
}
TestObject obj = [a: 1, b: 2, c: 3, d: 6, s: 's']
assert obj.a == 1 && obj.b == 2 && obj.c == 3 && obj.d == 6 && obj.s == 's'
Upvotes: 1
Reputation: 84786
You can use map:
class Test {
static class TestObject {
private int a = 1;
protected int b = 2;
public int c = 3;
int d = 4;
String s = "s";
}
static main(args) {
def o = ['a':1,b:'2',c:'3','d':5,s:'s'] as TestObject
println o.d
}
}
Will think about list in a moment.
EDIT
Hmm.. I'm not sure if it's possible with list. Only if You add an appropriate constructor. Full sample:
class Test {
static class TestObject {
TestObject() {
}
TestObject(a,b,c,d,s) {
this.a = a
this.b = b
this.c = c
this.d = d
this.s = s
}
private int a = 1;
protected int b = 2;
public int c = 3;
int d = 4;
String s = "s";
}
static main(args) {
def obj = ['a':1,b:'2',c:'3','d':5,s:'s'] as TestObject
assert obj.d == 5
obj = [1, 2, 3, 6, 's'] as TestObject
assert obj.d == 6
}
}
Upvotes: 5