我的 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/