问题标签 [kotlin-inline-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.
java - Kotlin 方法接受内联类作为参数 - 如何从 Java 访问?
假设我有:
inline class Email(value: String)
和
fun something(email: Email)
现在,如果我想something()
从 Java 打电话,我不能。因为任何接受内联类作为参数的方法都是“损坏的”(有关此的更多信息:https ://kotlinlang.org/docs/reference/inline-classes.html#mangling )据我所知,修饰重命名方法名称中包含一个“-”,它在 Java 中是一个无效字符,因此从 Java 的角度来看,该方法实际上是不可见的。这是故意的,可能是因为强大的类型安全性。但我真的需要让 Java 和 Kotlin 都可以调用该方法。你知道一些解决方法吗?
kotlin - JUnit 测试中的 Kotlin 内联类
我试图理解内联类的概念 - 它们是在运行时内联的单个属性的简单对象包装器。这意味着,类的实际初始化不会在运行时发生
我正在尝试编写简单的测试,它将在 JUnit 测试期间直接显示我的上述解释,如下所示:
不幸的是,这个测试失败了,这让我想到为什么在assertEquals()
实际展开的 String 值没有被比较,而是实际的内联类(应该在运行时展开)?
kotlin - 是否可以在 Kotlin 中使安全内联可选?
在 Kotlin 中,有时我必须使用双重可空性。例如,当我想使用T?
whereT
可能是可空类型时,我需要双重可空性。有几种方法可以做到这一点:
Holder<T>?
Holder
在哪里data class Holder<out T>(val element: T)
-示例1boolean
标志变量 -示例1containsKey
例如Map<K, T?>
-示例1UNINITIALIZED_VALUE
代表第二种的特殊null
-示例1
最后一种方法性能最好,但也最容易出错。所以我决定将它封装在inline class Optional<T>
:
第一个问题Optional
是public constructor
,它允许使用不匹配类型的参数创建实例。
第二个问题是在测试时注意到的。这是失败的测试:
例外:
如果我从中删除inline
修饰符Optional
,则测试将通过。
问:有什么方法可以在不删除inline
修饰符的情况下解决这些问题Optional
?
1示例包括一些上下文。请在写下我添加了错误链接之前完整阅读它们。
java - 实现底层接口的 Kotlin 内联类
在 kotlin vesion 1.3.0 中,开发人员可以使用内联类。
“普通”内联类被承诺在运行时不是真正的对象,而仅在编译时存在以进行类型检查。
所以例如
应编译为等效于以下内容的java:
然而,这也有效:
所以我想知道这究竟是如何编译的。我不知道bytecode
,所以我要求一般原则。
但是,如果这样一个应该实现某个接口的对象在运行时不存在,那么其他人必须实现该接口。它会成为内联类的接收者吗?如果接收者碰巧是不可修改的类型(例如来自其他已经编译的库)会发生什么?
我有这些担忧的原因与我最近偶然发现的一个问题有关。我需要一种更简洁的方式来Fragment
与Activity
大型项目进行交流。旧的方式只是说activity as? MainActivity
这不是“很干净”。所以我定义了这个接口:
并实现如下:
我将这种方法与内联类一起使用,将一些逻辑从 MainActivity 中移出并委派职责。
所以我担心的是在这里有内联类是否合适。在这种特定情况下使用时会有所不同吗?
mongodb - @Id 注释属性的 Kotlin 内联类
在我的业务逻辑中,我必须处理很多实体 ID,它们都是String类型,这可能会导致混淆,尤其是当您将其中的几个作为方法参数传递时。所以我想通过内联类引入一点类型安全性。我知道,内联类在 v1.3 中仍然被标记为实验性的。然而,有没有人尝试过在数据库映射上下文中使用内联类作为@Id属性,在我的例子中是带有 Spring Data 的 MongoDB。
和
我猜底层属性没有拆箱,所以 _id 最终会成为数据库中的一个对象?那么 Spring 的 CrudRepository 接口呢?它似乎是可编译的,但最终会起作用:
可能使用AttributeConverter
将内联类转换为原语可能会完成这项工作。有这方面的经验吗?
mongodb - 使用 Spring Data 将 Kotlin 内联类存储到 MongoDB
我正在尝试使用 Spring Data MongoDB (2.2.3-RELEASE) 将 Kotlin 的 (v1.3.61)内联类存储到 MongoDB,但到目前为止没有运气。这是设置:
和
Spring 在创建它的 bean 时抛出以下异常:
引起:java.lang.ArrayIndexOutOfBoundsException: 1 at org.springframework.data.mapping.model.PreferredConstructorDiscoverer$Discoverers.buildPreferredConstructor(PreferredConstructorDiscoverer.java:221) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2 .3.RELEASE] 在 org.springframework.data.mapping.model.PreferredConstructorDiscoverer$Discoverers.access$200(PreferredConstructorDiscoverer.java:89) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE ] 在 org.springframework.data.mapping.model.PreferredConstructorDiscoverer$Discoverers$2.lambda$discover$0(PreferredConstructorDiscoverer.java:161) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE]在 java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_171] 在 java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:第958章~[na:1.8.0_171]在java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)~[na:1.8.0_171]在java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java: 498) ~[na:1.8.0_171] 在 java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) ~[na:1.8.0_171] 在 java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java: 471) ~[na:1.8.0_171] 在 java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152) ~[na:1.8.0_171] 在 java.util.stream.AbstractPipeline.evaluate(AbstractPipeline. java:234) ~[na:1.8.0_171] at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464) ~[na:1.8.0_171] at org.springframework.data.mapping.model.PreferredConstructorDiscoverer$ Discoverers$2.discover(PreferredConstructorDiscoverer.java:164)~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE] at org.springframework.data.mapping.model.PreferredConstructorDiscoverer.discover(PreferredConstructorDiscoverer.java:77)~[spring-data -commons-2.2.3.RELEASE.jar:2.2.3.RELEASE] 在 org.springframework.data.mapping.model.BasicPersistentEntity.(BasicPersistentEntity.java:105) ~[spring-data-commons-2.2.3.RELEASE .jar:2.2.3.RELEASE] 在 org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity.(BasicMongoPersistentEntity.java:74) ~[spring-data-mongodb-2.2.3.RELEASE.jar:2.2.3 .RELEASE] 在 org.springframework.data.mongodb.core.mapping.MongoMappingContext.createPersistentEntity(MongoMappingContext.java:91) ~[spring-data-mongodb-2.2.3.RELEASE.jar:2.2.3.RELEASE] 在 org .springframework.data.mongodb.core.mapping.MongoMappingContext。createPersistentEntity(MongoMappingContext.java:39) ~[spring-data-mongodb-2.2.3.RELEASE.jar:2.2.3.RELEASE] at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:357 ) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE] at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:323) ~[spring-data- commons-2.2.3.RELEASE.jar:2.2.3.RELEASE] 在 java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_171] 在 org.springframework.data.mapping.context。 AbstractMappingContext.initialize(AbstractMappingContext.java:452) ~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE] at org.springframework.data.mapping.context.AbstractMappingContext.afterPropertiesSet(AbstractMappingContext.java :444)~[spring-data-commons-2.2.3.RELEASE.jar:2.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855)~[spring-beans -5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ~[spring-beans-5.2.2.RELEASE.jar: 5.2.2.RELEASE] ...省略了151个常用帧java:1792) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] ...省略了151个常用框架java:1792) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] ...省略了151个常用框架
堆栈跟踪非常模糊,但异常发生在构造函数PreferredConstructorDiscoverer
的userId
一部分中,因此问题可能出在此处。
接下来是检查Data
类的字节码:
这是PreferredConstructorDiscoverer
来自 Spring 源代码的相关第 221 行:
我是一个完全不懂字节码的菜鸟,但其中一个可能会立即看到问题。
我尝试过的其他方法是实现两个自定义类型的转换器,org.springframework.core.convert.converter.Converter<UserId,String>
反之亦然。但是,bean 实例化发生在任何转换发生之前,因此这似乎无关紧要。
我知道内联类在 Kotlin 1.3 中仍处于试验阶段,但实际问题可能出在其他地方。有人有想法吗?
顺便说一句,将类型从更改UserId
为String
一切工作正常。
android - 内存泄漏:实现 io.reactivex.Observer 的匿名类
我正在开发一个 Android 项目。我的一些活动正在扩展SiteFinderActivity
。此类负责验证当前会话并通过一些抽象函数将其传递给其子级。
我使用JakeWharton 的 RxRelay将 ViewModels 的结果传递给订阅者,在这个/我的例子中是 SiteFinderActivity。这是我的 ViewModel 的简化版本。
活动调用validateToken()
并侦听其中继以获取结果。
因为我在项目中经常使用这种方法,所以我创建了这个实用函数。这是我认为内存泄漏的根本原因。这是在项目某处的文件中(在活动之外)。
最后,这是 Leakcanary 为我记录的内容。它表明 888 正在泄漏。我阅读了许多文档并查看了 Stackoverflow 上的许多答案,但无法确切地意识到问题出在哪里。
kotlin - 未解决的参考:JvmInline In kotlin playground
这是取自kotlin 官方网站的值类的确切代码片段。
在 kotlin 操场上运行它给了我这两个相互矛盾的错误:
未解决的参考:JvmInline
不支持没有 @JvmInline 注释的值类
我不知道我哪里出错了,我只是想知道这段代码末尾的 val c 的类型。
kotlin - 泛型中的值类 - 与 Java/Groovy 的互操作性
我正在为泛型中的值类以及与 Java 或 Groovy 的互操作性而苦苦挣扎。值类是内联的:内联类 | Kotlin 1 除了泛型。
给定以下值类和接口(Kotlin):
如何在 Java 或 Groovy 中实现 ValueClassListProvider 接口?
尝试运行以下代码:
导致:
对于 ValueClassListProvider 接口的 Groovy 实现:
它可以编译并且似乎可以工作,但是当这个实现后来在 Kotlin 代码中使用时(假设这是在 spock 测试中使用的存根),它吹了:
是否可以在 Java 或 Groovy 中创建值类的实例(泛型需要)?