Kshitiz Sharma
Kshitiz Sharma

Reputation: 18597

How to coerce Groovy list into object?

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

Answers (2)

dmahapatro
dmahapatro

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

Opal
Opal

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

Related Questions