android - 在 Kotlin 中使用静态 Java 方法作为静态(或单例)属性

标签 android kotlin sdk kotlin-java-interop

我的 SDK 公开了一个只有静态方法的 Java 接口(interface),例如

public interface MyDevice { 
  public static void setLocation(Location location) {…}
  public static Location getLocation() {…}
}

在使用 SDK 的 Java 应用程序中,我的客户可以使用这些就好像它是一个单例,例如

Location currentLocation = MyDevice.getLocation();

当此 SDK 集成到 Kotlin 应用程序中时,很自然地表示为属性:

val currentLocation = MyDevice.location

问题是,此内置互操作仅适用于非静态方法。

我可以在 Kotlin 中创建一个单例并让它处理翻译:

object myDevice {
    var location: Location
    get() = MyDevice.getLocation()
    set(location) = MyDevice.setLocation(location)
}

但是,在其他仅支持 Java 的 SDK 中,这个单一的 Kotlin 文件不会对不使用 Kotlin 的客户产生负面影响吗?可以用Java表达吗?

或者我应该简单地将 MyDevice.java 转换为 Kotlin?对于仍在使用 Java 的客户,此步骤会有什么负面影响?

最佳答案

您描述的问题是缺少元数据 Kotlin 需要将静态方法视为扩展函数的类扩展属性。

连同问题 KT-11968至少现在是不可能的。

最好的选择是将 API 转换为 Kotlin,并在必要时支持 @JvmStaic/@JvmField 和 @JvmDefault 以实现向后兼容性。

interface MyDevice {
  companion object {
    // nullable type or explicit init
    var location: Location? 
      @JvmStatic get
      @JvmStatic set


// kotlin
val x = MyDevice.location
MyDevice.location = x


// java
var x = MyDevice.getLocation();
MyDevice.setLocation(x);

关于android - 在 Kotlin 中使用静态 Java 方法作为静态(或单例)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65081988/

相关文章:

android - 如何使用 Flows 处理数据库调用错误

ruby - 用于异步非阻塞调用的 AWS ruby​​ sdk

android - Google Play 音乐风格 GridView

java - Android Wear 加速度计仅提供 +- 2g

android - 我们是否需要以编程方式为工作管理器保留唤醒锁,或者工作管理器自己执行此操作?

java - 以下类无法实例化 : - android. support.v7.widget.Toolbar

kotlin - 无法通过匹配组 : ArrayIndexOutOfBoundsException: length=2; index=2 替换文本

kotlin - kotlin,在subscribe()中使用观察者对象实例时得到了 “Type mismatch. Required: Disposable? Found: Unit”

javascript - 安装Mixpanel SDK的问题-React Native

java - 当 BufferedReader.read(char[]) 返回 -1 时?