Inherited platform declarations clash


#1

When trying to extend the Java class “JavaSubClass” I get the following compiler errors:

Class ‘KotlinClass’ is not abstract and does not implement abstract base class member
public abstract fun setCollection(collection:(Mutable)Collection<String!>!): Unit defined in JavaSubClass


Inherited platform declarations clash: The following declarations have the same JVM signature (setCollection(Ljava/util/Collection;)V): fun setCollection(collection:(Mutable)Collection<(raw)Any?>!: Unit defined in KotlinClass fun setCollection(collection:(Mutable)Collection<String!>!): Unit defined in KotlinClass

Here’s my setup:

import java.util.Collection;

public interface JavaInterface {
    void setCollection(Collection<String> collection);
}

public class JavaClass {
    public void setCollection(Collection collection){}
}

public class JavaSubClass extends JavaClass implements JavaInterface {}

class KotlinClass : JavaSubClass()

Now there seem to be multiple possible workarounds:

  • In the JavaClass setCollection method specify the type to use Collection<String> instead of just Collection

  • In JavaSubClass override setCollection of JavaClass

    @Override
    public void setCollection(Collection collection) {
    super.setCollection(collection);
    }

What if everything but the Kotlin code is third-party? Well you still can create a new Java class which extends JavaSubClass, override setCollection and let the Kotlin class extend this new one.

Why do the Java and Kotlin compilers handle this case differently?