问题标签 [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.
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 - 无需 getter 直接从 Java 访问 kotlin 公共字段
下面是一个来自 Android 的模式示例(只是一个示例,对 android 细节不感兴趣):
然后模式是您访问文本字段,如下所示:
不幸的是,有一个具有固定结构的大文件执行上述操作,然后:
有可能解决这个问题吗?也许有一些@Jvm
注释
java - 你如何为 Java 制作 Kotlin 静态变量和函数?
自从 Google 将 Kotlin 打造为 Android 的一流语言以来,关于如何以“Java 风格”风格的 Kotlin 执行某些事情的问题越来越多。最常见的是如何static
在 Kotlin 中制作变量。那么如何制作 Kotlinstatic
变量和函数呢?
java - 我可以知道何时从 Java 或 Kotlin 调用我的库吗?
我正在为 Android 开发一个 Kotlin 库。我想为 Kotlin 和 Java 开发人员提供出色的开发人员体验,但是因为我没有无限的资源,所以我需要在它们之间进行优先级排序。
该库正在与我控制的服务器进行交互,因此我可以将元数据添加到网络调用中,这将帮助我了解用户的划分。
但是有没有办法知道我的库何时从 Java VS Kotlin 调用?
我在这个答案中看到可能有一种方法可以检查给定的类,但是作为库所有者,我认为如果不使用反射会增加一些运行时成本,我无法知道哪个类正在调用我自己的类。没有办法在运行时从 JVM 获取元数据,这将表明代码是否是从 Kotlin 编译的(即使以误报为代价,例如检查是否KAPT
在任何时候使用过至少会报告一些 Kotlin用户?)
java - 从 Java(和 Kotlin)隐藏 Kotlin 对象的实例字段
简短的问题
我可以将 Kotlin 对象INSTANCE
(用于 Java 互操作)的可见性修改为internal
或降低吗?
长问题
我正在编写一个库,并且我想要一个用 Kotlin 编写的 API 文件/类,它公开一个要从 Java 或 Kotlin 调用的函数,如下所示:
科特林:
爪哇:
我可以通过这样写来实现这一点:
科特林:
但是,现在我也可以这样做:
爪哇:
为了简单起见,我想阻止这种访问以INSTANCE
将我的 API 表面保持在最低限度。
我可以修改INSTANCE
tointernal
或更低的可见性吗?
这可能是不可能的,因为对API
(来自 Kotlin 的)的任何调用都会返回对象的实例,并且可能也应该隐藏它才能实现。但是,我很好奇它是否没有重大黑客攻击。
使用 Java 的解决方案是用 Java 编写API
:
但是,我正在寻找用 Kotlin 编写的解决方案。
kotlin - 为什么生成的 getter 方法中有美元符号?
我正在将我的代码库从 Java 转换为 Kotlin,我们一次转换几个类。在今天的这个过程中,我注意到一个非常奇怪的互操作问题,我希望有办法解决。
我有一个包保护的 Java 类,我将其转换为内部 Kotlin 类。这是该课程的精简版:
我注意到,当我尝试从 Java 中使用这个类(在同一个包中)时,它会将构建名称和一个美元符号附加到我的 getter for method
. 像这样:
request.getMethod$myproject_debug()
如果我公开方法字段,这将停止发生。我真的希望有办法解决这个问题,因为如果不是这样,切换到 Kotlin 将是一个大问题。
java - 如何从 Java 创建 Kotlin 列表?
如何从 Java访问和listOf
等方法。我在一个不使用 Kotlin 的项目中,但我们想使用有效的只读 Kotlin 集合。为什么?因为即使在 Java 中使用不可变列表时,它们也有会在运行时而不是在编译期间引发错误的 mutator 方法。mapOf
setOf
kotlin - 为什么 Kotlin 在 JVM 中盲目地将内部类改为 public?
如您所知,Kotlin 中的私有类在引擎盖下更改为包私有,内部更改为公共。不幸的是,这可能会导致这里的已知问题。
如果编译器看到 Kotlin 内部类的使用情况,想把它改成字节码,它可以为包外没有使用的内部 kotlin 类选择 package-private,其他的选择 public,这样我们就可以处理了以上问题由我们自己解决。
或者他们可以在内部类之前定义另一个注释,例如@JvmPackagePrivate,以告诉编译器我们想要java中的包私有类。
或者他们可以两者都做。
问题是,为什么他们没有用如此明显的解决方案来解决这个明显的问题?
他们有另一种方法来解决这个问题吗?
我刚刚熟悉了 Kotlin,所以我认为我不能用 kotlin 为 java 创建 lib,因为当我创建内部具体类时,所有客户端都可以在库之外看到它们以及它与 kotlin 的严重问题。为什么他们看不到这个明显的问题??????
我想提一下,这里的答案都没有解决这个问题,因为 @JvmSynthetic 和 @JvmName 只是针对 kotlin 中的乐趣,而不是类,最后它们都是可见的,即使它们更改了类的名称。
最后kotlin声称它与java完全可以互操作,但我认为这是不对的。最好说它与 java 有 99% 的互操作性 :)
kotlin - 带有 Java 超类的 Kotlin 数据类
我有一个 Java 类,它包含有关数据库实体的通用信息(即它们的 id)。
我们使用 Lombok@Data
来生成 getter toString
,equals
...
在 Java 中,我会简单地扩展这个类并@Data
再次添加。
在较新的服务中,我们使用 Kotlin,但希望重用标准类,例如DbEntity
.
我的第一种方法是简单地声明一个数据类,例如
经过一番阅读,我找到了几个解决方案,所有这些我都不太满意。
- 不要使用数据类。这可行,但让我承担实施
equals
等任务。
- 复制字段。这可行,但我们最终会得到两个可能不同步的字段。
- 为 getter 分配一个不同的名称。这从根本上也复制了该字段,但隐藏了 getter。
正如我所说,我对上面提出的任何解决方案都不满意。使用抽象超类或接口肯定会更合适。但是,Entity 类驻留在主要 Java 项目所依赖的库中。我只是因为新的 Kotlin 依赖而犹豫要更改它。
有没有人遇到过类似的问题并就如何解决这些问题提出建议?
kotlin - 不推荐使用的 kotlin 函数在纯 Java 项目上没有警告
kotlin
我有一个纯粹在库项目中编写的测试类。
我已经弃用了带有注释的testFunction() 。Deprecated
BtwDeprecated
类在 kotlin 包下。当我在 kotlin 项目中测试这个不推荐使用的功能时,它按预期工作(ide 显示不推荐使用的警告和删除线)
示例:测试()。测试函数(“测试”)
但是在 java 项目中,它不会显示警告或删除线来功能再见。当我打开已弃用函数的声明时,如下所示
任何帮助,将不胜感激