当前位置: 首页 > 知识库问答 >
问题:

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

佘京
2023-03-14

fun setCollection(collection:(Mutable)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() 

Java本身就不存在这个问题。所以我猜测这可能与平台类型有关(string!不是any?)。

有没有一个优雅的解决方案来解决这个问题,最好不需要编写Java代码?还是应该在Kotlin编译器中解决这个问题?

共有1个答案

卫劲
2023-03-14

我没有研究java如何/为什么在JavaSubClass中工作的细节,即它产生了什么字节码,但是从Kotlin的角度来看,如果我研究这两个方法的签名,它们会有不明确的分派。

这个:

public void setCollection(Collection collection){}

视作为一个方法,它设置泛型类型为any?的集合。有吗?是字符串的超集。

如果您的类的客户端具有以下属性:

myCollection = Array<String>()
myInstanceOfKotlinClass.setCollection(myCollection)

应该调度哪种方法?

出于这个原因,我认为这不是Kotlin编译器中的一个bug,而是对一些更宽松的java泛型类型安全的改进。显然,java对这两种方法如何以字节码编译成同一个类做出了选择,如果您知道在上述情况下将选择哪种方法进行调度,那么这是一种好的方法。但我认为,你应该能从签名单独分辨出哪一个,而不是一些内在的知识。

fun JavaSubClass.newFunctionality(){}

看看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);
    }
}
 类似资料:
  • 我正在将Java中的一些类转换为kotlin,当试图从接口继承时,我遇到了编译错误: 平台声明冲突:以下声明具有相同的JVM签名(getContentID()ljava/lang/string;): 我对Kotlin来说是超级新的。

  • 我正在将Java中的一些类转换为kotlin,当试图从接口继承时,我遇到了编译错误: 平台声明冲突:以下声明具有相同的JVM签名(getContentID()ljava/lang/string;): 下面是课程: 我对Kotlin来说是超级新的。

  • 见 映射类继承层次结构 对于这个部分。

  • 我在下棋。我想做一个抽象的piece类,然后可以通过pawn/knight/rook/等进行扩展。假设我的piece类是这样的: 我希望Pawn具有相同的sayName功能,但我希望它具有不同的movePiece功能,因为Pawn有自己独特的移动方式。我怎么做典当,使它扩展件,并覆盖件的移动件功能?

  • 我是 Kotlin 的新手,我有以下疑问 - 使用Java到Kotlin转换器(此链接),我将以下Java代码转换为Kotlin。 Java类: 生成的Kotlin类: 但是我不明白Java代码和生成的静态编程语言代码是如何等价的,因为类数据成员的可见性修饰符从私有(Java)变为公共(静态编程语言)。 我相信,如果可见性修饰符被保留(数据成员在静态编程语言中被声明为私有),getter和sett

  • 特定于 Declarative 映射API。 在 1.4 版更改: 绝大多数声明性扩展现在集成到SQLAlchemy ORM中,并且可以从 sqlalchemy.orm 命名空间。请参阅上的文档 声明性映射 对于新文档。有关更改的概述,请参见 声明式现在集成到ORM中,具有新的特性 . Object Name Description AbstractConcreteBase “concrete”声