问题标签 [sealed-class]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
15469 浏览

kotlin - 从 Kotlin 中的密封类扩展数据类

我有一组共享一些公共字段的数据类,所以理想情况下,我想在超类型中声明它们(本例中为 Message),并且如果他们需要访问这些公共字段,则能够编写对超类型进行操作的函数字段(本例中的 messageId)。

我试图通过从密封类扩展我的数据类来实现这一点。

数据类可以扩展密封类,但我不确定它们如何/是否可以接受“超类型”密封类所需的参数。

  1. 从密封类扩展常规类编译得很好。

    /li>
  2. 但是,将其更改为数据类不会编译(“数据类主构造函数必须只有属性 (val/var) 参数。”)。

    /li>
  3. 将参数声明为属性也不会编译(“'messageId' 隐藏超类型'Message' 的成员并需要'覆盖'修饰符'”)。

    /li>
  4. 打开超类型属性并在每个基类中覆盖它可以很好地编译:

    /li>

理想情况下,我想要接近选项 2 的东西——它让我能够结合两全其美。

否则,似乎我的选择要么使用选项 1 处理我自己的数据类功能(复制、哈希码、equals 等),要么通过使用选项 4 打开超类型属性来妥协。

0 投票
2 回答
1694 浏览

kotlin - Kotlin 中的密封类,不兼容类型错误

我有以下 Kotlin 代码。一个称为密​​封类Animal,以及两个对象类DogCat继承自密封类Animal。我when在 is Cat 案例的子句中收到此错误。

为什么会出现此错误?如何在 Kotlin 中使用密封类来进行这种类型的操作?密封类是做多态性的好选择吗?

0 投票
2 回答
14514 浏览

enums - 使用关联类型时的密封类与枚举

我想创建一个基于Int. 我可以使用sealed classand获得相同的结果,enum并且想知道一个是否比另一个更好。

使用sealed class

使用enum

它们在性能方面是否相当?有没有更好的 kotlin 方法来实现相同的结果?

0 投票
1 回答
2067 浏览

android - 我如何在 Retrofit2 中使用密封类作为返回类型

我的密封课

改造2请求

当我调用以下代码时

我遇到了一个例外

引起:java.lang.RuntimeException:无法调用没有参数的私有 ....TranslationResponse()

PS如果替换Observable<TranslationResponse>Observable<Success>我的代码有效

0 投票
1 回答
1183 浏览

generics - 将泛型类型传递给嵌套的密封类

是否可以?我如何向编译器解释它的相同类型(BR)扩展了相同的类?下面的代码失败

0 投票
1 回答
103 浏览

kotlin - 当“when”语句未涵盖所有实现时,强制编译器发出错误

也许这是一个荒谬的问题。我有一个接收Command(密封类)并返回的方法Unit,我希望编译器崩溃是否所有when分支都没有实现:

上面的代码没问题,但我不希望它编译。

当方法返回任何不同于 的东西时Unit,它不会编译:

我想要这种行为,但什么都不返回(Unit)。我理解为什么会发生这种情况,但我想知道是否有任何方法可以更改我的代码以实现我想要的。我需要涵盖所有Command实现,而不会忘记以后可能添加的任何人。

0 投票
1 回答
4778 浏览

android - 此代码如何引发 NoWhenBranchMatchedException?

在我们最近发布的应用程序中,我们看到kotlin.NoWhenBranchMatchedException向 Fabric/Crashlytics 报告了少数 s。

这是有问题的代码片段:

和类定义:

我对这段代码在理论上如何抛出异常感到困惑——正如你所看到的,我们甚至引入了这个handled值,只是为了强制编译器确保所有情况都得到处理......

0 投票
3 回答
1311 浏览

c# - 为什么我们需要密封类?

我知道 Sealed 类的功能。它不可继承。但我的问题是为什么我们需要一个密封类?如果不继承属性和方法是动机,为什么不将它们声明为私有呢?

0 投票
1 回答
48 浏览

c# - 密封关键字防止类的继承

密封关键字防止类的继承。继承是面向对象程序的特征之一。这是否意味着密封不是哎呀概念?

0 投票
1 回答
818 浏览

intellij-idea - 如何在 IntelliJ IDEA 中配置用于暂存文件的 Kotlin 版本?

我最近安装了 IntelliJ IDEA 以尝试学习 Kotlin。我已经建立了一个 Kotlin 项目并将 IDEA 配置为使用 Kotlin 插件的最新稳定版本 (1.2.71-release-IJ2018.2-1)。

如果在项目文件中执行以下代码(例如src/main.kt),则可以正常工作:

但是,如果我尝试在暂存文件中执行此操作,则会收到以下错误:

Kotlin 文档中,我可以看到这是因为密封类的这种用法仅在 Kotlin 1.1+ 中有效。这意味着项目文件使用 >= Kotlin 1.1 执行,而暂存文件使用 < Kotlin 1.1。

我想知道为什么 Kotlin 暂存文件似乎没有使用与主要项目文件相同的 Kotlin 版本,以及我如何指定用于执行暂存文件的 Kotlin 版本。

下面是我用于临时文件的运行/调试配置示例:

执行暂存文件时,我看到暂存输出窗格中出现以下命令(为清晰起见更改了格式):