问题标签 [kotlin-java-interop]
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.
kotlin - 抛出 NoWhenBranchMatchedException 时如何穷举?
我观察到一个带有详尽when
语句的 LiveData,它如何NoWhenBranchMatchedException
在运行时抛出一个?在编译时没有检查详尽性吗?
java - 自定义 Java 注释不适用于 Kotlin 项目
我正在编写一个 Android 应用程序并创建了一个 Java 文件,其中包含我在 Kotlin 类中使用的注释。我正在使用kapt
注释处理器。
编译器中的一切似乎都没有显示错误,但是当我运行应用程序时,出现错误:
incompatible types: NonExistentClass cannot be converted to Annotation
-@error.NonExistentClass()
这只是一个kapt
限制吗?我读了一些关于 Kotlin 如何存根函数的内容(但我认为保留了声明站点)。那么这可能意味着它不知道该怎么做,因为函数声明中的参数标有注释?
请参阅:kapt 用 error.NonExistentClass 替换生成的类引用,尽管启用了 kapt.correctErrorTypes 任何想法如何解决这个问题?
Java注释文件:
Kotlin 使用文件:
java - Kotlin 中的 Java 类型
我正在使用 Kotlin 中的 Java Lib。一个(重要的)函数需要一个 java.util.HashMap <String, Object> 作为参数。
在 Java 中,大多数类型都是 java.lang.Object 的一部分。在 Kotlin 中并非如此,它们是 Any 的一部分。
我需要在 HashMap 中放入 String 和 int 类型的字符串键和值。像这样:
当然,在这种情况下,它们是不扩展 Java Object 类的 Kotlin 类型。我的问题是它们必须是 java.lang.Object 的一部分才能使用 lib。我该如何存档?
先感谢您。
kotlin - Kotlin 的“内部”关键字 Java 互操作
我试图弄清楚从 Java 的角度来看内部类会发生什么。
在文档中找到了这个:
内部类的成员会经过名称修改,以便更难在 Java 中意外使用它们,并允许根据 Kotlin 规则重载具有相同签名但彼此看不到的成员
所以我很想看看它在实践中的样子。
我创建了一个简单的 Kotlin 类:
建了一个项目,解压jar,用javap看了一下实际的类……它显示了一个标准的公共类,原来的名字:
我错过了什么吗?还是仅仅是误导性的文档?
文档提到了 internal classes 的成员,但我也尝试过:
并得到了预期的输出:
和:
kotlin - kotlin 惯用的方法,在传入可为空的 mutableMap 时使其更简单
从 java 转换为 kotlin
爪哇代码
科特林代码
无论传入的地图是否为空,kotlin 代码都会创建临时地图。
有没有更好的方法来避免创建此地图?
java - 如何将 Kotlin Nothing 翻译成 Java?
我有一堂课是MyClass<T>
我需要将其子类化为MySubclass<Nothing>
但有时我需要发送MyClass
对 Java 函数的引用,该函数又可以接收MySubclass
,我该如何声明它以使其兼容?
还是我应该简单地使用void receiveClass(aClass: MyClass<*>)
?
kotlin - 泛型中的值类 - 与 Java/Groovy 的互操作性
我正在为泛型中的值类以及与 Java 或 Groovy 的互操作性而苦苦挣扎。值类是内联的:内联类 | Kotlin 1 除了泛型。
给定以下值类和接口(Kotlin):
如何在 Java 或 Groovy 中实现 ValueClassListProvider 接口?
尝试运行以下代码:
导致:
对于 ValueClassListProvider 接口的 Groovy 实现:
它可以编译并且似乎可以工作,但是当这个实现后来在 Kotlin 代码中使用时(假设这是在 spock 测试中使用的存根),它吹了:
是否可以在 Java 或 Groovy 中创建值类的实例(泛型需要)?
kotlin - 在 Kotlin 中确定 Java 静态方法的范围
有一个 Java 库的类,它有aVeryLongNameThatIDontWantToTypeEveryTime
. 这个类有一些具有通用名称的静态方法:get()
等abs()
。
现在我需要在我的 kotlin 代码中使用它们构建复杂的调用,如下所示:
现在,我想使用本地范围功能,以免经常重复自己。但是,只需使用
不起作用:它抱怨 aVeryLongNameThatIDontWantToTypeEveryTime 没有伴随对象。(当然不是,它是一个 Java 类。)
唯一的“解决方案”是全局导入aVeryLongNameThatIDontWantToTypeEveryTime.*
文件,这不是很好,因为方法名称非常通用并且可能发生冲突。
java - 指定 -jvm-target / jvmTarget 版本不是 1.8 的好处
从 Kotlin 1.6.0 开始,对于 Kotlin/JVM 项目,可以指定-jvm-target version
最高为 Java 的选项17
,请参阅通用和Gradle 插件文档。
这样做有什么好处?除了指定默认值之外,我找不到太多关于指定其他内容的好处1.8
。
我能找到的唯一的东西是:
- 在 JVM 9+ 目标上,字符串连接被编译成动态调用(invokedynamic),请参阅Kotlin 1.5.20 的发布博客
- 在 JVM 10+ 目标上,
Record
支持 Java 的,请参阅Kotlin 1.5.0 的发布博客。
两者在我看来都微不足道。
特别是因为当指定一个更高的目标时,人们失去了在使用 Java 1.8 的项目中使用生成的工件的能力,这对于库来说似乎是不受欢迎的。
我在这里错过了什么吗?