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

0 投票
1 回答
249 浏览

kotlin - 抛出 NoWhenBranchMatchedException 时如何穷举?

我观察到一个带有详尽when语句的 LiveData,它如何NoWhenBranchMatchedException在运行时抛出一个?在编译时没有检查详尽性吗?

0 投票
0 回答
236 浏览

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 使用文件:

0 投票
1 回答
118 浏览

java - Maven 多模块中的 Kotlin 1.5.0:java.lang.UnsupportedClassVersionError

0 投票
1 回答
96 浏览

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。我该如何存档?

先感谢您。

0 投票
0 回答
75 浏览

kotlin - Kotlin 的“内部”关键字 Java 互操作

我试图弄清楚从 Java 的角度来看内部类会发生什么。

在文档中找到了这个:

内部类的成员会经过名称修改,以便更难在 Java 中意外使用它们,并允许根据 Kotlin 规则重载具有相同签名但彼此看不到的成员

所以我很想看看它在实践中的样子。

我创建了一个简单的 Kotlin 类:

建了一个项目,解压jar,用javap看了一下实际的类……它显示了一个标准的公共类,原来的名字:

我错过了什么吗?还是仅仅是误导性的文档?

文档提到了 internal classes 的成员,但我也尝试过:

并得到了预期的输出:

和:

0 投票
2 回答
50 浏览

kotlin - kotlin 惯用的方法,在传入可为空的 mutableMap 时使其更简单

从 java 转换为 kotlin

爪哇代码

科特林代码

无论传入的地图是否为空,kotlin 代码都会创建临时地图。

有没有更好的方法来避免创建此地图?

0 投票
1 回答
56 浏览

java - 如何将 Kotlin Nothing 翻译成 Java?

我有一堂课是MyClass<T>

我需要将其子类化为MySubclass<Nothing>

但有时我需要发送MyClass对 Java 函数的引用,该函数又可以接收MySubclass,我该如何声明它以使其兼容?

还是我应该简单地使用void receiveClass(aClass: MyClass<*>)

0 投票
0 回答
108 浏览

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

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

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

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

尝试运行以下代码:

导致:

对于 ValueClassListProvider 接口的 Groovy 实现:

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

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

0 投票
1 回答
42 浏览

kotlin - 在 Kotlin 中确定 Java 静态方法的范围

有一个 Java 库的类,它有aVeryLongNameThatIDontWantToTypeEveryTime. 这个类有一些具有通用名称的静态方法:get()abs()

现在我需要在我的 kotlin 代码中使用它们构建复杂的调用,如下所示:

现在,我想使用本地范围功能,以免经常重复自己。但是,只需使用

不起作用:它抱怨 aVeryLongNameThatIDontWantToTypeEveryTime 没有伴随对象。(当然不是,它是一个 Java 类。)

唯一的“解决方案”是全局导入aVeryLongNameThatIDontWantToTypeEveryTime.*文件,这不是很好,因为方法名称非常通用并且可能发生冲突。

0 投票
1 回答
218 浏览

java - 指定 -jvm-target / jvmTarget 版本不是 1.8 的好处

从 Kotlin 1.6.0 开始,对于 Kotlin/JVM 项目,可以指定-jvm-target version最高为 Java 的选项17,请参阅通用Gradle 插件文档。

这样做有什么好处?除了指定默认值之外,我找不到太多关于指定其他内容的好处1.8

我能找到的唯一的东西是:

两者在我看来都微不足道。

特别是因为当指定一个更高的目标时,人们失去了在使用 Java 1.8 的项目中使用生成的工件的能力,这对于库来说似乎是不受欢迎的。

我在这里错过了什么吗?