Inheritance 在Kotlin中扩展Java类时继承的平台声明发生冲突

Inheritance 在Kotlin中扩展Java类时继承的平台声明发生冲突,inheritance,kotlin,java-interop,Inheritance,Kotlin,Java Interop,我正在尝试使用Kotlin扩展第三方Java类,但我收到以下编译器消息: 继承的平台声明冲突:以下声明已发生冲突 相同的JVM签名(setCollection(Ljava/util/Collection;)V): fun setCollection(collection:(可变)collection!:在KotlinClass中定义的单位 fun setCollection(collection:(可变)collection!):在KotlinClass中定义的单位 无论我做什么,都无法仅用

我正在尝试使用Kotlin扩展第三方Java类,但我收到以下编译器消息:

继承的平台声明冲突:以下声明已发生冲突 相同的JVM签名(setCollection(Ljava/util/Collection;)V):

  • fun setCollection(collection:(可变)collection!:在KotlinClass中定义的单位

  • fun setCollection(collection:(可变)collection!):在KotlinClass中定义的单位

无论我做什么,都无法仅用Kotlin代码编译它

再现情况的代码:

//JavaInterface.class
import java.util.Collection;

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

//JavaBaseClass.class
import java.util.Collection;

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

//JavaSubClass.class
public class JavaSubClass extends JavaBaseClass implements JavaInterface {}

//KotlinClass.kt
class KotlinClass : JavaSubClass() 
//JavaInterface.class
导入java.util.Collection;
公共接口JavaInterface{
无效集合(集合);
}
//JavaBaseClass.class
导入java.util.Collection;
公共类JavaBaseClass{
公共void集合集合(集合集合){}
}
//JavaSubClass.class
公共类JavaSubClass扩展JavaBaseClass实现JavaInterface{}
//KotlinClass.kt
类KotlinClass:JavaSubClass()
Java本身没有这个问题。所以我猜这可能与平台类型有关(
String!
不是
Any?


对于这个问题,是否有一个优雅的解决方法,最好不涉及编写Java代码?或者这应该在Kotlin编译器本身内解决吗?

我没有详细研究Java如何/为什么在您的Java子类中工作,即产生什么字节码,但是如果我查看thos的签名,则从Kotlin的角度来看如果有两种方法,它们的分派将不明确

这:

被视为使用泛型类型Any?设置集合的方法?。 有吗?是字符串的超集

如果您的类的客户端具有以下内容:

myCollection = Array<String>()
myInstanceOfKotlinClass.setCollection(myCollection)
感觉您正在使用的第三方代码本身在使用泛型和继承方面做得很差。但是,无论是哪种方式,如果您需要更改现有功能的行为,还是需要新功能的实例状态,我认为您必须在Java领域处理这种模糊性,因为Kotlin不同意我认为这是原则问题

编辑:

看看java,这个

//JavaSubClass.class
public class JavaSubClass extends JavaBaseClass implements JavaInterface {}
意味着JavaBaseClass实现了接口

它拓宽了接口的通用类型。令人讨厌的类型擦除错误迫在眉睫。我的意思是看这个:

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        JavaSubClass sc = new JavaSubClass();
        ArrayList<Integer> myCollection = new ArrayList<>();
        sc.setCollection(myCollection);
    }
}
import java.util.ArrayList;
公共班机{
公共静态void main(字符串[]args){
JavaSubClass sc=新的JavaSubClass();
ArrayList myCollection=新建ArrayList();
sc.setCollection(myCollection);
}
}

eew.

我明白你的意思。这会导致运行时异常,以防误用。显然,除了Kotlin之外,所有人都会这么做,这毕竟不是很糟糕,因为它增加了类型安全性。谢谢你的解释。
//JavaSubClass.class
public class JavaSubClass extends JavaBaseClass implements JavaInterface {}
import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        JavaSubClass sc = new JavaSubClass();
        ArrayList<Integer> myCollection = new ArrayList<>();
        sc.setCollection(myCollection);
    }
}