问题标签 [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.

0 投票
1 回答
412 浏览

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 都可以调用该方法。你知道一些解决方法吗?

0 投票
0 回答
34 浏览

java - 除了在类中装箱之外,有没有办法用原语实现清洁器?

所以,我们有一个围绕vulkan的 kotlin 包装器,它依赖于 vulkan 标识符(通常是Longs)的内联类

据我所知,Java(9+)Cleaner应该只适用于类。

这里有一个例子

我试图修改它以使用普通原语运行

但遗憾的是没有成功。

所以我的问题是,是否有一种方法可以Cleaner使用表示本机堆外资源的原语,而不必将它们包装在类中

0 投票
1 回答
443 浏览

kotlin - JUnit 测试中的 Kotlin 内联类

我试图理解内联类的概念 - 它们是在运行时内联的单个属性的简单对象包装器。这意味着,类的实际初始化不会在运行时发生

我正在尝试编写简单的测试,它将在 JUnit 测试期间直接显示我的上述解释,如下所示:

不幸的是,这个测试失败了,这让我想到为什么在assertEquals()实际展开的 String 值没有被比较,而是实际的内联类(应该在运行时展开)?

0 投票
1 回答
209 浏览

kotlin - 是否可以在 Kotlin 中使安全内联可选?

在 Kotlin 中,有时我必须使用双重可空性。例如,当我想使用T?whereT可能是可空类型时,我需要双重可空性。有几种方法可以做到这一点:

  1. Holder<T>?Holder在哪里data class Holder<out T>(val element: T)-示例1
  2. boolean标志变量 -示例1
  3. containsKey例如Map<K, T?>-示例1
  4. UNINITIALIZED_VALUE代表第二种的特殊null-示例1

最后一种方法性能最好,但也最容易出错。所以我决定将它封装在inline class Optional<T>

第一个问题Optionalpublic constructor,它允许使用不匹配类型的参数创建实例。

第二个问题是在测试时注意到的。这是失败的测试:

例外:

如果我从中删除inline修饰符Optional,则测试将通过。

:有什么方法可以在不删除inline修饰符的情况下解决这些问题Optional


1示例包括一些上下文。请在写下我添加了错误链接之前完整阅读它们。

0 投票
1 回答
395 浏览

java - 实现底层接口的 Kotlin 内联类

在 kotlin vesion 1.3.0 中,开发人员可以使用内联类。

“普通”内联类被承诺在运行时不是真正的对象,而仅在编译时存在以进行类型检查。

所以例如

应编译为等效于以下内容的java:

然而,这也有效:

所以我想知道这究竟是如何编译的。我不知道bytecode,所以我要求一般原则。

但是,如果这样一个应该实现某个接口的对象在运行时不存在,那么其他人必须实现该接口。它会成为内联类的接收者吗?如果接收者碰巧是不可修改的类型(例如来自其他已经编译的库)会发生什么?

我有这些担忧的原因与我最近偶然发现的一个问题有关。我需要一种更简洁的方式来FragmentActivity大型项目进行交流。旧的方式只是说activity as? MainActivity这不是“很干净”。所以我定义了这个接口:

并实现如下:

我将这种方法与内联类一起使用,将一些逻辑从 MainActivity 中移出并委派职责。

所以我担心的是在这里有内联类是否合适。在这种特定情况下使用时会有所不同吗?

0 投票
2 回答
376 浏览

mongodb - @Id 注释属性的 Kotlin 内联类

在我的业务逻辑中,我必须处理很多实体 ID,它们都是String类型,这可能会导致混淆,尤其是当您将其中的几个作为方法参数传递时。所以我想通过内联类引入一点类型安全性。我知道,内联类在 v1.3 中仍然被标记为实验性的。然而,有没有人尝试过在数据库映射上下文中使用内联类作为@Id属性,在我的例子中是带有 Spring Data 的 MongoDB。

我猜底层属性没有拆箱,所以 _id 最终会成为数据库中的一个对象?那么 Spring 的 CrudRepository 接口呢?它似乎是可编译的,但最终会起作用:

可能使用AttributeConverter将内联类转换为原语可能会完成这项工作。有这方面的经验吗?

0 投票
2 回答
558 浏览

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(Ite​​rable.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个常用框架

堆栈跟踪非常模糊,但异常发生在构造函数PreferredConstructorDiscovereruserId一部分中,因此问题可能出在此处。

接下来是检查Data类的字节码:

这是PreferredConstructorDiscoverer来自 Spring 源代码的相关第 221 行:

我是一个完全不懂字节码的菜鸟,但其中一个可能会立即看到问题。

我尝试过的其他方法是实现两个自定义类型的转换器,org.springframework.core.convert.converter.Converter<UserId,String>反之亦然。但是,bean 实例化发生在任何转换发生之前,因此这似乎无关紧要。

我知道内联类在 Kotlin 1.3 中仍处于试验阶段,但实际问题可能出在其他地方。有人有想法吗?

顺便说一句,将类型从更改UserIdString一切工作正常。

0 投票
1 回答
266 浏览

android - 内存泄漏:实现 io.reactivex.Observer 的匿名类

我正在开发一个 Android 项目。我的一些活动正在扩展SiteFinderActivity。此类负责验证当前会话并通过一些抽象函数将其传递给其子级。

我使用JakeWharton 的 RxRelay将 ViewModels 的结果传递给订阅者,在这个/我的例子中是 SiteFinderActivity。这是我的 ViewModel 的简化版本。

活动调用validateToken()并侦听其中继以获取结果。

因为我在项目中经常使用这种方法,所以我创建了这个实用函数。这是我认为内存泄漏的根本原因。这是在项目某处的文件中(在活动之外)。

最后,这是 Leakcanary 为我记录的内容。它表明 888 正在泄漏。我阅读了许多文档并查看了 Stackoverflow 上的许多答案,但无法确切地意识到问题出在哪里。

0 投票
1 回答
1309 浏览

kotlin - 未解决的参考:JvmInline In kotlin playground

这是取自kotlin 官方网站的值类的确切代码片段。

在 kotlin 操场上运行它给了我这两个相互矛盾的错误:
未解决的参考:JvmInline
不支持没有 @JvmInline 注释的值类

我不知道我哪里出错了,我只是想知道这段代码末尾的 val c 的类型。

0 投票
0 回答
108 浏览

kotlin - 泛型中的值类 - 与 Java/Groovy 的互操作性

我正在为泛型中的值类以及与 Java 或 Groovy 的互操作性而苦苦挣扎。值类是内联的:内联类 | Kotlin 1 除了泛型。

给定以下值类和接口(Kotlin):

如何在 Java 或 Groovy 中实现 ValueClassListProvider 接口?

尝试运行以下代码:

导致:

对于 ValueClassListProvider 接口的 Groovy 实现:

它可以编译并且似乎可以工作,但是当这个实现后来在 Kotlin 代码中使用时(假设这是在 spock 测试中使用的存根),它吹了:

是否可以在 Java 或 Groovy 中创建值类的实例(泛型需要)?