# Extending Groovy class from Kotlin

**URL:** <https://discuss.kotlinlang.org/t/extending-groovy-class-from-kotlin/1675>\
**Category:** Support\
**Created:** [May 16, 2016, 8:47pm UTC](https://discuss.kotlinlang.org/t/extending-groovy-class-from-kotlin/1675 "2016-05-16T20:47:46Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Dmitry\_Kandalov](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/dmitry_kandalov/32/1970_2.png) [@Dmitry\_Kandalov](https://discuss.kotlinlang.org/u/Dmitry_Kandalov)\
**Post date:** [May 16, 2016, 8:47pm UTC](https://discuss.kotlinlang.org/t/extending-groovy-class-from-kotlin/1675/1 "2016-05-16T20:47:46Z")

</div>

When I try to extend Groovy class in Kotlin, Kotlin compiler complains about missing methods from GroovyObject (getMetaClass, etc). For example:

```kotlin
object : MyGroovyClass() {
	override fun fooo() {
		// ...
	}
}

```

results in error `Object must be declared abstract or implement abstract base class member public abstract fun setProperty(p0: String!, p1: Any!): Unit defined in MyGroovyClass`

Groovy classes can be extended from Java and Scala. I was wondering what is special about Kotlin? Does it ignore synthetic methods or I missed something?

---

<div class="post-metadata">

**Author:** ![neworldLT](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/neworldlt/32/2257_2.png) [@neworldLT](https://discuss.kotlinlang.org/u/neworldLT)\
**Post date:** [November 27, 2017, 8:33pm UTC](https://discuss.kotlinlang.org/t/extending-groovy-class-from-kotlin/1675/3 "2017-11-27T20:33:19Z")

</div>

I had tried extend [NpmTask](https://github.com/srs/gradle-node-plugin/blob/master/src/main/groovy/com/moowork/gradle/node/npm/NpmTask.groovy) and got same error.

 ![image](https://us1.discourse-cdn.com/flex019/uploads/kotlinlang/original/2X/6/68d34249e26616cd7df65c1eb544ac0cb302369e.png)

---

<div class="post-metadata">

**Author:** ![darksnake](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/darksnake/32/2479_2.png) [@darksnake](https://discuss.kotlinlang.org/u/darksnake)\
**Post date:** [November 27, 2017, 8:44pm UTC](https://discuss.kotlinlang.org/t/extending-groovy-class-from-kotlin/1675/4 "2017-11-27T20:44:49Z")

</div>

I found in a hard way that Groovy is not very backwards compatible with java and therefore kotlin. You can surely call both java and kotlin classes from Groovy (in case of kotlin it is a bit disappointing since Groovy and Kotlin have many similar features, but they are not interoperable), but you can’t easily call Groovy from Java and Kotlin. In theory, you can, but Groovy dynamic features always get in a way.  
First recommendation: Do not try to do it. Implement all your logic in Kotlin/Java and Groovy only as a fine user interface layer.  
Second recommendation. If you definitely need it, use a groovy `@CompileStatic`.

In your case, you can try to create a groovy wrapper class extending `NpmTask` and make it call some Kotlin code (calls from Groovy to Kotlin work just fine).

---

<div class="post-metadata">

**Author:** ![blindpirate](https://avatars.discourse-cdn.com/v4/letter/b/b5ac83/32.png) [@blindpirate](https://discuss.kotlinlang.org/u/blindpirate)\
**Post date:** [November 3, 2018, 8:19am UTC](https://discuss.kotlinlang.org/t/extending-groovy-class-from-kotlin/1675/5 "2018-11-03T08:19:28Z")

</div>

The short answer is, yes, Kotlin compiler does ignore synthetic methods in Groovy class bytecode. And `@CompileStatic` doesn’t help in this situation.

The workaround I’m current using is creating a bridge `KotlinExtendsGroovyWorkaround.java` file then extends it in Kotlin.

```auto
public class KotlinExtendsGroovyWorkaround extends NpmTask {
    @Override
    public Object invokeMethod(String s, Object o) {
        return super.invokeMethod(s, o);
    }

    @Override
    public Object getProperty(String s) {
        return super.getProperty(s);
    }

    @Override
    public void setProperty(String s, Object o) {
        super.setProperty(s, o);
    }

    @Override
    public MetaClass getMetaClass() {
        return super.getMetaClass();
    }

    @Override
    public void setMetaClass(MetaClass metaClass) {
        super.setMetaClass(metaClass);
    }
}

```

---

<div class="post-metadata">

**Author:** ![huehnerlady](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/huehnerlady/32/8059_2.png) [@huehnerlady](https://discuss.kotlinlang.org/u/huehnerlady)\
**Post date:** [October 21, 2020, 12:55pm UTC](https://discuss.kotlinlang.org/t/extending-groovy-class-from-kotlin/1675/6 "2020-10-21T12:55:25Z")

</div>

@blindpirate I know it was quite a while ago, but maybe you still know the answer 🙂

I tried your way but I get a compile error:  
 ![image](https://us1.discourse-cdn.com/flex019/uploads/kotlinlang/original/2X/f/f91933b7113a4431310c193e6f398a02daf51077.png)

So is there any magic in your Groovy class? 🙂
