问题标签 [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.
json - 与杰克逊一起在 Kotlin 中使用多态(反)序列化缺少身份字段
我有以下类层次结构注释:
我的想法是我可以将一个集合(ArrayList)NetCommand
传递给第二个应用程序,并将它们正确反序列化为适当的子类。
我还编写了一个简单的测试来帮助我迭代注解/杰克逊映射器的不同配置:
这失败了:
出现此错误:
任何想法为什么我的类型字段没有被序列化?
(不太理想)解决方案
我找到了一个解决方案,即手动将已初始化的字段添加到具有子类名称的子类主体中。例如。
理想情况下,我只想自动使用简单的类名,而不是name = "AddEntity"
在每次JsonSubTypes.Type
调用时使用等。
android - 密封类在 Android 环境中的性能影响是什么?
在 Android 中,由于性能问题,建议不要使用枚举。直到最近才如此,在 Google IO 2018 中宣布枚举现在可以安全使用,尽管对于性能更高的应用程序仍然建议避免使用它们。
我的问题是:
我们可以在 android 中广泛使用 kotlin 密封类吗?
似乎密封类是枚举的扩展。如果是这样,我们应该使用类似于枚举的密封类吗?
提前致谢。
java - 从 Java 访问 Kotlin 密封类
到目前为止,我一直在使用这个 Kotlin 密封类:
这在我的 Kotlin 和 Java 代码中都运行良好。今天我尝试将此类更改为使用对象(建议减少额外的类实例化):
我可以在我的其他 Kotlin 文件中引用这个简单的 peasy,但我现在正在努力在我的 Java 文件中使用它。
在尝试在 Java 中引用时,我尝试了以下方法,并且这两个都回退了编译错误:
有谁知道我现在如何引用 Java 中的实例?
android - Firestore(Kotlin)在执行文档请求时将完整任务转换为密封类的正确方法
我正在尝试一种正确的方法,在对文档执行获取请求时将完整的任务转换为易于阅读的密封类(此时,我将在稍后看到集合请求)。
有了这个片段,我可以这样做:
我的问题是:
1)当 isSuccessFul 为 false 时,我们能否合理地确保 Task.exception 始终不为 null 且 FirebaseFirestoreException 的实例?
2)当 task.isSuccessful 为 true 时,我们确定 task.result 始终不为空吗?
提前致谢
android - 使用 Kotlin 密封类路由到不同的屏幕
像这样创建密封类是个好主意:
因此,Route
密封类将定义当前屏幕可以“路由到”的所有可能目的地。因此,例如“LoginScreen”可以具有以下密封类:
现在ViewModel
我可以拥有:
然后在视图中,我可以观察proceedToDestination
并执行以下操作:
我的问题是,这总体上是一个好主意还是一个好的做法?提前致谢。
编辑:
只是真的想让它再次活跃起来,也许能找到一些答案。
generics - 通用密封类的类型安全使用
当我编写通用密封类时,我发现了有趣的事情。这是第一个版本:
假设我们也有这样的请求功能:
现在在使用方面我们有错误:
第一个问题:
Failure
并且Cancelled
不T
用于进/出位置,为什么这个演员没有被检查,我需要压制它?
过了一会儿,康斯坦丁向我展示了如何声明类型安全的密封类的解决方案:
这个声明就像一个魅力,现在我有问题:
第二个问题:为什么要
out
在这里写修饰符?第三个问题:为什么
Producer<Nothing>
是亚型Producer<MyInterface>
?根据协变的定义:Producer<A>
是Producer<B>
if的子类型的A
子类型B
,但Nothing
不是 的子类型MyInterface
。它看起来像未记录的语言外功能。
kotlin - 在内部对象之后初始化伴随对象
假设我想创建一个密封的类,里面装满了一些对象。然后我想创建所有这些对象的列表,所以我在伴生对象中创建列表:
但是,上面代码的问题是,当Color.Blue
第一次直接调用时,伴随对象在之前初始化Blue
,因此结果列表包含[Red, null]
. 这是双重问题,因为 Kotlin 假设列表包含非空值。
我知道上面的例子很简单,我可以用 替换sealed class
,enum
但这只是一个简化的例子。在许多情况下,使用密封类而不是枚举是有益的(例如,当您需要向单个对象添加类型参数时)。
用最少的样板和分配对象来解决这个问题的最佳方法是什么?我想出了两个解决方法,但我不喜欢其中任何一个:
懒惰的
上面的解决方案看起来不错并且不会造成太多样板,但它创建了一个额外的对象,该对象永远为伴随对象中的每个属性而存在。我还需要在任何其他属性上重复惰性关键字。
将初始化移动到另一个对象
这种方法的好处是只为伴生对象中的所有属性创建一个对象,但它创建了许多额外的样板。
有没有更好的方法来实现这一目标?
编辑:对于这种情况,Kotlin 问题跟踪器存在问题:https ://youtrack.jetbrains.com/issue/KT-8970
unit-testing - Kotlin 密封类和类型推断
我使用密封类向客户端代码报告成功或错误:
但是我坚持使用它来编译最简单的单元测试:
我收到消息:类型推断失败。没有足够的信息来推断 fun instanceOf(type : Class<*>) 中的参数 T:Matcher!
看起来我错过了 Kotlin 中的一些重要内容。
谢谢你的协助!
android - 如何从 recyclerView 适配器访问密封类的内部数据类
我在为正在构建的聊天界面设置 ViewModel 数据时遇到问题,我想在聊天布局 (RecyclerView) 中显示各种不同类型的数据。其中包括:文本、按钮、卡片视图轮播...
我已经设置了一个 Sealed 类,我希望它能够包含显示这些数据所需的所有数据类,它看起来像这样的 atm:
在我的适配器中,我将其添加到 arrayList 以进行显示:
并添加一个新项目如下:
但我无法访问
itemsOld[0].content
或者
itemsOld[0].originator
只要
itemsOld[0].msgTime
我如何构造数据类,以便我有一个可以由 ArrayList 实现的父类,并且可以保存我可能需要同时在 RecyclerView 中显示的所有数据类?