首页
学习
活动
专区
工具
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 的接口,并让 密封父类 实现了这个接口,子类默认在构造函数中实现该属性即可。

    82230

    Kotlin、Swift、Scala 的延迟求值

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

    1.8K20

    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 时也应该同时有歌曲信息。

    57330

    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.3K10

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

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

    1.8K40

    《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 修饰的类称为密封类,用来表示受限的类层次结构。例如当一个值为有限集中的 类型、而不能有任何其他类型时。...在某种意义上,他们是枚举类的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例。

    67020

    Kotlin 1.4.30-RC 密封接口来啦!

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

    71230

    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

    Kotlin 1.2 的新增了哪些特性?

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

    2.8K10

    C Sharp(六)

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

    43730
    领券