首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在将Kotlin密封类传递给构造函数时,Scala编译器会给我一个错误?

在将Kotlin密封类传递给Scala构造函数时,Scala编译器会给出错误的原因是因为Kotlin密封类在编译成Java字节码时会生成一个包含所有子类的静态内部类,而Scala编译器无法正确地处理这种结构。

Kotlin密封类是一种特殊的类,用于表示受限的类继承结构。它允许你定义一组有限的子类,并且只能在密封类的内部进行继承。这样可以确保所有可能的子类都是已知的,从而在使用密封类时提供更好的类型安全性。

然而,Scala编译器并不支持Java字节码中的密封类结构。当你尝试将Kotlin密封类传递给Scala构造函数时,Scala编译器无法正确地解析密封类的子类,因此会给出错误。

解决这个问题的一种方法是使用普通的Kotlin类替代密封类。如果你不需要密封类的特性,可以将其改为普通类,并使用继承来表示类之间的关系。

另一种解决方法是避免在Scala代码中直接使用Kotlin密封类,而是将其封装在一个Java类中,并在Scala中使用该Java类。这样可以绕过Scala编译器对密封类的限制。

总结起来,Scala编译器无法正确处理Kotlin密封类的结构,因此在将其传递给Scala构造函数时会出现错误。解决方法包括改用普通类替代密封类或通过封装在Java类中使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

追随 KotlinScala,看 Java 12-15 的现代语言特性

Java 文本块起始的三重双引号后只能跟空白符和换行,因此不能像 Kotlin/Scala 那样写 """hello""",而必须这样写: """ hello""" Java 自动去掉第一个换行以及每行末尾的空白...没有记录类型之前,创建一个具有各字段对应 getter、为所有字段初始化的构造函数、基于所有字段的 equals()/hashCode()/toString() 的简单却需要写一大堆代码,其中大部分都是样板代码...Java 15 引入的密封(sealed class)类似于 Kotlin/Scala密封密封接口类似于 Scala密封特质(sealed trait)。...不妨二者统称为密封类型,与普通/接口不同的是,密封类型限定了哪些/接口作为其直接子类型。...追随 Kotlin/Scala 的步伐。

1.3K20

Kotlin Vocabulary | 密封 sealed class

子类可以是任意的: 数据Kotlin 对象、普通的,甚至也可以是另一个密封。但不同于抽象的是,您必须把层级声明同一文件中,或者嵌套在的内部。...使用 when 语句处理密封,如果没有覆盖所有情况,可以让编译器给我一个错误提示。...,所以 IDE 可以帮我们补全 when 语句下的所有分支: 当涉及到一个层级复杂的密封,这个功能显得更加好用,因为 IDE 依然可以识别所有的分支: sealed class Result<out...工作原理 为何密封拥有这些特性?...Result 是一个抽象,并且包含两个构造方法: 一个私有的默认构造方法 一个合成构造方法,只有 Kotlin 编译器可以使用 这意味着其他的无法直接调用密封构造方法。

1.2K10
  • Kotlin|这些隐藏的内存陷阱,你应该熟记于心

    导航 学完本篇,你将了解到以下内容: 密封构造函数值的使用细节; 内联函数,你应该注意的地方; 伴生对象隐藏的性能问题; lazy ,可能没你想的那么简单; apply !...密封的小细节 密封用来表示受限的继承结构:当一个值为有限几种的类型、而不能有任何其他类型。...摘自Kotlin中文文档 关于它用法,我们具体不再做赘述。 密封虽然非常实用,经常能成为我们多type的绝佳搭配,但其中却藏着一些使用的小细节,比如 构造函数值所导致的损耗问题。...错误示例 sealed 初始化 如题,我们有一个公用的属性 sum ,为了便于复用,我们将其抽离到 Fruit 构造函数中,让子类便于初始化时传入,而不用重复显式声明。...♂️ 答案是可以,我们利用 接口 改造即可,如下所示: 如上所示,我们增加了一个名为 IFruit 的接口,并让 密封 实现了这个接口,子类默认构造函数中实现该属性即可。

    81030

    Kotlin、Swift、Scala 的延迟求值

    只有使用时才会初始化,这个看上去简单的逻辑,通常我们 Java 当中会写出来非常啰嗦,延迟初始化也经常因为各种原因变成“忘了”初始化,导致程序出现错误。 这一切 Kotlin 当中变得非常简单。...简单来说,Kotlin 的 Lazy 是一个很普通的,它可以承载 Kotlin 当中各种对于延迟计算的需求的实现,用在属性定义上借用了属性代理的语法,用作函数参数就使用高阶函数 lazy 来构造或者直接传入函数作为参数即可...Scala 的延迟求值 Scala 当中 lazy 是个关键字。而相比之下, Kotlin 当中我们提到 Lazy 是指类型,提到 lazy,则是指构造 Lazy 对象的高阶函数。...Boolean 类型的表达式,编译器帮我们自动转换为 BooleanByName 类型丢给 assertAllTrue 函数。...参数 conditions 前面的下划线,一般语言的参数都只有参数名,也就是 conditions,Swift 还有一个参数标签的概念,用于函数调用时指定(其实我们 Kotlin 当中调用函数也可以参数前加参数名

    1.7K20

    Kotlin 1.4.30-M1 增强的内联是个什么东西?

    当然,对于这样的小函数编译器和运行时已经足够聪明到可以自己自动做优化了,内联函数 Kotlin 当中最大的作用其实是高阶函数的内联,我们就以最为常见的 forEach 为例: inline fun...内联的语法其实也简单,与 Kotlin 当中其他的枚举密封、数据的定义方式类似, class 前面加一个 inline 即可: inline class PlayerState(val value...我们再看一个稍微复杂的情形: val idleState = PlayerState(0) println(idleState) 我们直接这个内联的实例传给 println,这下编译器怎么办呢?... Kotlin 1.4.30 以前,内联构造器必须是 public 的,这意味着在过去我们不能通过内联来完成对某一种特定类型的部分值的包装:因为外部一样可以创造出来新的内联实例。...我们前面给出的 PlayerState 其实不够完善,例如状态为 error ,也应该同时附带错误信息;状态为 playing 也应该同时有歌曲信息。

    56830

    Kotlin入门(15)独门秘笈之特殊

    内部类的调用代码如下所示: btn_class_inner.setOnClickListener { //使用内部类,必须调用外部类的构造函数,否则编译器会报错...可是枚举类型实际上是一种,开发者代码中创建enum类型编译器自动生成一个对应的,并且该类继承自java.lang.Enum。...枚举变量本质上还是该类的一个实例,所以如果枚举存在构造函数的话,枚举变量也必须调用对应的构造函数。这样做的好处是,每个枚举值不但携带唯一的名称,还可以拥有更加个性化的特征描述。...为解决枚举值判断的多余分支问题,Kotlin提出了“密封”的概念,密封就像是一种更加严格的枚举,它内部有且仅有自身的实例对象,所以是一个有限的自身实例集合。...不过正如声明变量那样,如果编译器能够根据初始值判断该变量的类型,就无需显式指定该变量的类型;模板也存在类似的偷懒写法,如果编译器根据输入参数就能知晓参数类型,则调用模板构造函数也不必显式指定参数类型

    1.3K30

    Kotlin | 一份10万字的随查笔记,妈妈再也不担心我不会Ctrl+F了

    ,Int实际是 int与Integer的合体,必要的时候,编译器自动帮我们进行分辨。...{ } 程序结构 常量与变量 val 声明常量,类似于 Java 的final 关键字,不可被重复赋值 Kotlin 里面有类型推导,编译器可以推导量的类型,所以可推导类型定义可以不用写数据类型...几类函数的调用 包级函数:静态方法 java里并没有这种函数,它在编译的时候,会为Kotlin生成一个,这个包含了所有包级函数java看来,这些都只是静态方法,所以java调用的时候,按照静态按方法调用即可...,等 顶级声明不支持 protected 顶级声明被 private 修饰表示文件内部可见 延迟初始化 类属性必须在构造初始化 某些成员只有构造之后才会被初始化 latteinit 编译器忽略变量的初始化...密封是一种特殊的抽象 密封的子类定义自身相同的文件中 密封的子类个数有限 简单来说,密封相当于一事物的具体子分类,有明确的类型区别,子类有具体个数。

    2.8K20

    《Kotin 极简教程》第7章 面向对象编程(OOP)(2)《Kotlin极简教程》正式上架:

    密封 7.10.1 为什么使用密封 就像我们为什么要用enum类型一样,比如你有一个enum类型 MoneyUnit,定义了元、角、分这些单位。...某种意义上,sealed是枚举的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封一个子类可以有可包含状态的多个实例。...密封的所有子类都必须与密封一个文件中声明( Kotlin 1.1 之前, 该规则更加严格:子类必须嵌套在密封声明的内部): sealed class Expression class Unit...var、val修饰的变量,Kotlin编译器自动为它们生成getter、setter函数。...面向对象编程的特性: 构造函数、抽象与接口、继承以及多重继承等基础知识,同时介绍了Kotlin中的注解、枚举、数据密封、嵌套、内部类、匿名内部类等特性

    1.6K20

    是时候使用Kotlin编程了

    2,安全性 Kotlin提供了安全符“?”,当变量可以为null,必须使用可空安全符?进行声明,否则会出现编译错误。...Kotlin为什么可以兼容Java,一个主要原因是Kotlin文件经过Kotlin编译器编译后会生成Java字节码。...调用如下: 5,Lambda表达式支持 Lambda表达式的本质是一个未声明的函数,他以表达式的形式传递。既然是函数,就由这三块组成:参数 、 方法体 和 返回值。...例如: 调用高阶函数的方式如下: 当然,我们也可以声明一个局部函数,然后把他作为参数传递给一个函数,还可以使用Lambda表达式来表示函数参数。...Kotlin Native Kotlin Native是一种Kotlin源码编译成不需要任何VM支持的目标平台二进制数据的技术,编译后的二进制数据可以直接运行在目标平台上,它主要包含一个基于LLVM的后端编译器的和一个

    3.2K10

    Bruce Eckel:我最喜欢Python,Kotlin取代Java(附演讲全文+PPT)

    这是我们第一次看到这种类型推测,和第一个方法进行对比,这个函数没有返回值的具体类型,编译器在看到这个方法具体构造的时候就能够知道这个返回值是一个String的类型。...这个SomeBody它的内容就是它的构造器,就是它的构造函数。...Badger这个大家可以看到它必须强制的带两个参数,一个是id String类型,一个是age,是一个Int的类型,就是Kotlin构造函数里面的时候必须要说明它的类型是怎么样的,因为编译器是无法推测出你这个带的参数的类型是什么样的...这是另外一个,叫Snake,它也有自己的变量和override的一个方法,大家看它和上一个Badger之间的区别就在于Badger的构造函数里面带了两个参数,但是Snake这个构造函数里面用到了var...这是一个我们构造函数里面遇到val的一个例子,我希望大家能够知道Kotlin这种语言的魅力就在于它极大的简化了工程师的工作量,并且能够减少工程师阅读其他工程师代码的痛苦。

    1.7K40

    Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)第五章 Kotlin 面向对象编程(OOP)1. 面向对象的HelloWorld2. 面向对象编程思想简述3.Kotlin 面向

    3.3 构造函数 Kotlin中的可以有主构造函数(Primary Constructor)和一个或多个二级构造函数(Secondary Constructor)。...要创建一个的实例,我们只要像普通的函数那样调用其构造函数即可: val person = Person("Jack",29) Kotlin中,不再使用new关键字 成员 可以包括 构造和初始化模块...函数 属性 匿名 内部类 对象声明 3.5 继承 Kotlin所有的中都有一个共同的父Any(这跟Scala一样),这是一个默认的open根父。...Kotlin继承父并覆盖父函数,要求父必须有open标注,被覆盖的函数必须有open标注,并且子类的函数必须加override标注: open class Base { open fun...例如当一个值为有限集中的 类型、而不能有任何其他类型某种意义上,他们是枚举的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封一个子类可以有可包含状态的多个实例。

    1.5K30

    Kotlin 1.4 版本正式发布:新功能一覽

    此管道的第一步俗称为编译器的前端。它解析代码和命名、执行类型检查等。此编译器的这一部分也可以 IDE 中使用,来高亮显示语法错误、导航到定义并搜索项目中的符号用法。...通过SAM转换可以Java中对SamType的调用,转换为一个对Lambda的调用,减少大量的模板代码,但是同样SamType如果定义Kotlin中,是无法转换的: interface Action...属性代理优化 我们自定义属性代理,为了能够调用getValue/setValue获取KProperty,Kotlin在编译期会生成一个$$delegatedProperties数组,用来存储所有可能用到...4.函数式编程 Kotlin 语言一等支持函数式编程,就像Scala一样。具备高阶函数、Lambda 表达式等函数式基本特性。...5.默认和命名参数 Kotlin中,您可以为函数中的参数设置一个默认值,并给每个参数一个名称。这有助于编写易读的代码。

    1.2K10

    Kotlin Primer·与对象(上)

    4.1 构造函数 Kotlin构造函数可以写在头中,跟在名后面,如果有注解还需要加上关键字constructor。这种写法声明的构造函数,我们称之为主构造函数。...另外, JVM 上,如果主构造函数的所有的参数都有默认值,编译器会生成一个额外的无参构造函数,它将使用默认值。...enum class Programer { JAVA, KOTLIN, C, CPP, ANDROID; } 当它被编译成 class 后,转为如下代码实际就是一个私有了构造函数kotlin.Enum...4.4.2 sealed 密封 sealed 修饰的称为密封,用来表示受限的层次结构。例如当一个值为有限集中的 类型、而不能有任何其他类型。...某种意义上,他们是枚举的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封一个子类可以有可包含状态的多个实例。

    66720

    Kotlin 1.4.30-RC 密封接口来啦!

    语法上,Java 秉持着它一贯的“啰嗦”的特点,密封接口定义,还要明确写出 permits,告诉大家这个接口只能够被以下几个实现。...你会不会感觉很奇怪,看一下后面这几行不就知道了,为什么还有加一个 permits?...因为我们编写 Java 代码的时候,通常一个就是一个文件,因此 Java 的密封接口不会去限制只能在文件内部定义实现(就像 Kotlin 那样),因此 permits 是必须的。...因为密封的子类使用的过程中总是声明成父,这个过程总是会出现装箱: val playerState: PlayerState = Idle ... playerState = Error(...)...// 装箱 所以,我们几乎可以认为,内联密封当中使用基本上都是错误的用法。

    70830

    Kotlin 的 val list: ArrayList= ArrayList() 居然报错!

    1 语法错误?...2 分析 Kotlin 的解析过程 这么说来就比较有意思了,Kotlin 的解析器并不会因为前面有泛型而把后面的 >= 识别成 > = ,难道是说解析的过程中,先通过词法分析器把一个个字符识别成一个个...实际上编译之后 Kotlin.flex 会生成 _JetLexer.java 这个文件,KotlinLexer 这个是词法分析器的入口,我们解析处打个断点: ?...注意 FlexAdapter 实际上是 KotlinLexer 的父。 调试运行编译器,我比较喜欢的方式是编译一段脚本: ? 脚本里面就只有我们最开头的那句报错的代码,那么结果怎样呢? ?...不过我觉得>=编译器没解析好不是什么大问题,很多语言都有类似的缺陷,但是这从来不是一个问题。

    1.3K10

    Kotlin 1.2 的新增特性

    例如,当一个 lambda 作为构造函数参数传递给一个对象,后者可以用于引用另一个必须稍后定义的对象: lateinit修饰符现在可以用在顶级属性和局部变量上。...例如,当作为构造函数参数传递给一个对象的 lambda 引用另一个对象,稍后必须定义的对象可以使用: 循环中的值:1, 2, 3, 1, 2, 3, 1, ......弃用:数据的覆写性拷贝 当从已经具有相同签名的拷贝函数的类型派生数据,为数据生成的 copy 实现使用父类型的默认函数导致出现与预期相反的行为,如果父类型没有默认参数,则在运行时失败 导致复制冲突的继承已经被...这可能影响应用程序的整体性能;仅在多个之间共享一些复杂的状态并在初始化时更新才使用它。 “手工”的解决方法是控制流的子表达式的值存储变量中,而不是直接在调用参数中对它们进行求值。...工具 警告视为错误 编译器现在提供了所有警告视为错误的选项。命令行中使用 -Werror,或使用以下的 Gradle 代码:

    2.8K70

    IntelliJ IDEA 2022.2 正式发布,功能真心强大!

    @ConfigurationProperties ,涵盖新的构造函数绑定语法,无需显式 @ConstructorBinding。...来自 URL 的页面对象命名 创建新的页面对象文件,向导现在提供一个可选的 URL 字段。如果包含 Web 地址,向导根据链接地址建议页面对象文件名。...另外,我们添加的支持还覆盖 无选项提取器、类型 lambda 和 * 多态函数类型、类型级编译器内在函数 * 以及作为通配符与 _ 一起 Scala 2.13.9 和 2.12.16 中使用的 ?。...新的 Scala 检查 匿名函数内部使用 return 关键字跳出函数而不执行其中的所有代码,IntelliJ IDEA 2022.2 现在会发出警告。...当 private 或 class 形参隐藏超变量触发新警告。此外,试图以编译器禁止的方式覆盖变量时会显示错误

    2.4K10

    C Sharp(六)

    结构 ---- 结构与类似,都是用户定义类型,都有数据成员和函数成员,但有两个最大的区别: 是引用类型而结构是值类型 结构是隐式密封的 strcut StructName { MemberDeclarations...需要注意与的赋值的不同。 结构允许有实例构造函数和静态构造函数,但不允许有析构函数。 与一样,编译器隐式的为结构提供一个无参构造,这个构造每个成员设置为该类型的默认值。...与不同的是,这个无参构造函数不能被重定义,我们只能创建另外的有参构造,而不能重写无参构造,并且我们提供了有参构造编译器提供给我们的无参构造依然存在。...另外说一句: JavaScript 中的简单类型如 string 也可以调用方法,他们是使用值被临时包装成一个对象。 枚举 ---- 枚举只有一个类型的成员: 命名的整数值常量。...注意: 枚举是一个独特的类型,比较不同类型的枚举对象导致编译错误,即使他们的底层都是整数。

    43330

    Kotlin 1.2 的新增了哪些特性?

    例如,当一个 lambda 作为构造函数参数传递给一个对象,后者可以用于引用另一个必须稍后定义的对象: lateinit修饰符现在可以用在顶级属性和局部变量上。...例如,当作为构造函数参数传递给一个对象的 lambda 引用另一个对象,稍后必须定义的对象可以使用: ? 循环中的值:1, 2, 3, 1, 2, 3, 1, ......弃用:数据的覆写性拷贝 当从已经具有相同签名的拷贝函数的类型派生数据,为数据生成的 copy 实现使用父类型的默认函数导致出现与预期相反的行为,如果父类型没有默认参数,则在运行时失败 导致复制冲突的继承已经被...这可能影响应用程序的整体性能;仅在多个之间共享一些复杂的状态并在初始化时更新才使用它。 “手工”的解决方法是控制流的子表达式的值存储变量中,而不是直接在调用参数中对它们进行求值。...工具 警告视为错误 编译器现在提供了所有警告视为错误的选项。命令行中使用 -Werror,或使用以下的 Gradle 代码: ?

    2.8K10
    领券