问题标签 [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 投票
2 回答
1600 浏览

json - 与杰克逊一起在 Kotlin 中使用多态(反)序列化缺少身份字段

我有以下类层次结构注释:

我的想法是我可以将一个集合(ArrayList)NetCommand传递给第二个应用程序,并将它们正确反序列化为适当的子类。

我还编写了一个简单的测试来帮助我迭代注解/杰克逊映射器的不同配置:

这失败了:

出现此错误:

任何想法为什么我的类型字段没有被序列化?


(不太理想)解决方案

我找到了一个解决方案,即手动将已初始化的字段添加到具有子类名称的子类主体中。例如。

理想情况下,我只想自动使用简单的类名,而不是name = "AddEntity"在每次JsonSubTypes.Type调用时使用等。

0 投票
3 回答
1442 浏览

android - 密封类在 Android 环境中的性能影响是什么?

在 Android 中,由于性能问题,建议不要使用枚举。直到最近才如此,在 Google IO 2018 中宣布枚举现在可以安全使用,尽管对于性能更高的应用程序仍然建议避免使用它们。

我的问题是:

我们可以在 android 中广泛使用 kotlin 密封类吗?

似乎密封类是枚举的扩展。如果是这样,我们应该使用类似于枚举的密封类吗?

提前致谢。

0 投票
1 回答
5986 浏览

java - 从 Java 访问 Kotlin 密封类

到目前为止,我一直在使用这个 Kotlin 密封类:

这在我的 Kotlin 和 Java 代码中都运行良好。今天我尝试将此类更改为使用对象(建议减少额外的类实例化):

我可以在我的其他 Kotlin 文件中引用这个简单的 peasy,但我现在正在努力在我的 Java 文件中使用它。

在尝试在 Java 中引用时,我尝试了以下方法,并且这两个都回退了编译错误:

有谁知道我现在如何引用 Java 中的实例?

0 投票
1 回答
174 浏览

kotlin - Kotlin 密封类 - 为什么编译器不检查所有子类型?

使用密封类时,编译器仅检查同一文件中的子类型。

密封类的一大卖点是使用when表达式时的详尽检查。那么为什么不实施呢?

在 1 个文件中,我有:

在另一个文件中,我有:

0 投票
1 回答
463 浏览

android - Firestore(Kotlin)在执行文档请求时将完整任务转换为密封类的正确方法

我正在尝试一种正确的方法,在对文档执行获取请求时将完整的任务转换为易于阅读的密封类(此时,我将在稍后看到集合请求)。

有了这个片段,我可以这样做:

我的问题是:

1)当 isSuccessFul 为 false 时,我们能否合理地确保 Task.exception 始终不为 null 且 FirebaseFirestoreException 的实例?

2)当 task.isSuccessful 为 true 时,我们确定 task.result 始终不为空吗?

提前致谢

0 投票
1 回答
756 浏览

android - 使用 Kotlin 密封类路由到不同的屏幕

像这样创建密封类是个好主意:

因此,Route密封类将定义当前屏幕可以“路由到”的所有可能目的地。因此,例如“LoginScreen”可以具有以下密封类:

现在ViewModel我可以拥有:

然后在视图中,我可以观察proceedToDestination并执行以下操作:

我的问题是,这总体上是一个好主意还是一个好的做法?提前致谢。

编辑:

只是真的想让它再次活跃起来,也许能找到一些答案。

0 投票
1 回答
798 浏览

generics - 通用密封类的类型安全使用

当我编写通用密封类时,我发现了有趣的事情。这是第一个版本:

假设我们也有这样的请求功能

现在在使用方面我们有错误:

第一个问题Failure并且CancelledT用于进/出位置,为什么这个演员没有被检查,我需要压制它?

过了一会儿,康斯坦丁向我展示了如何声明类型安全的密封类的解决方案:

这个声明就像一个魅力,现在我有问题:

第二个问题:为什么要out在这里写修饰符?

第三个问题:为什么Producer<Nothing>是亚型Producer<MyInterface>?根据协变的定义:Producer<A>Producer<B>if的子类型的A子类型B,但Nothing不是 的子类型MyInterface。它看起来像未记录的语言外功能

0 投票
1 回答
198 浏览

kotlin - 在内部对象之后初始化伴随对象

假设我想创建一个密封的类,里面装满了一些对象。然后我想创建所有这些对象的列表,所以我在伴生对象中创建列表:

但是,上面代码的问题是,当Color.Blue第一次直接调用时,伴随对象在之前初始化Blue,因此结果列表包含[Red, null]. 这是双重问题,因为 Kotlin 假设列表包含非空值。

我知道上面的例子很简单,我可以用 替换sealed classenum但这只是一个简化的例子。在许多情况下,使用密封类而不是枚举是有益的(例如,当您需要向单个对象添加类型参数时)。

用最少的样板和分配对象来解决这个问题的最佳方法是什么?我想出了两个解决方法,但我不喜欢其中任何一个:

懒惰的

上面的解决方案看起来不错并且不会造成太多样板,但它创建了一个额外的对象,该对象永远为伴随对象中的每个属性而存在。我还需要在任何其他属性上重复惰性关键字。

将初始化移动到另一个对象

这种方法的好处是只为伴生对象中的所有属性创建一个对象,但它创建了许多额外的样板。

有没有更好的方法来实现这一目标?

编辑:对于这种情况,Kotlin 问题跟踪器存在问题:https ://youtrack.jetbrains.com/issue/KT-8970

0 投票
3 回答
2313 浏览

unit-testing - Kotlin 密封类和类型推断

我使用密封类向客户端代码报告成功或错误:

但是我坚持使用它来编译最简单的单元测试:

我收到消息:类型推断失败。没有足够的信息来推断 fun instanceOf(type : Class<*>) 中的参数 T:Matcher!

看起来我错过了 Kotlin 中的一些重要内容。

谢谢你的协助!

0 投票
1 回答
328 浏览

android - 如何从 recyclerView 适配器访问密封类的内部数据类

我在为正在构建的聊天界面设置 ViewModel 数据时遇到问题,我想在聊天布局 (RecyclerView) 中显示各种不同类型的数据。其中包括:文本、按钮、卡片视图轮播...

我已经设置了一个 Sealed 类,我希望它能够包含显示这些数据所需的所有数据类,它看起来像这样的 atm:

在我的适配器中,我将其添加到 arrayList 以进行显示:

并添加一个新项目如下:

但我无法访问

itemsOld[0].content

或者

itemsOld[0].originator

只要

itemsOld[0].msgTime

我如何构造数据类,以便我有一个可以由 ArrayList 实现的父类,并且可以保存我可能需要同时在 RecyclerView 中显示的所有数据类?