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

标签 kotlin scoping kotlin-java-interop

有一个 Java 库的类,其中包含 aVeryLongNameThatIDontWantToTypeEveryTime。该类有一些具有通用名称的静态方法:get()abs() 等。

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

aVeryLongNameThatIDontWantToTypeEveryTime.get(aVeryLongNameThatIDontWantToTypeEveryTime.abs(aVeryLongNameThatIDontWantToTypeEveryTime.get(...), aVeryLongNameThatIDontWantToTypeEveryTime.get(...)))

现在,我想使用本地作用域函数,以免经常重复。但是,只需使用

with(aVeryLongNameThatIDontWantToTypeEveryTime) {
  get(abs(get(...), get(...)))
}

不起作用:它提示 aVeryLongNameThatIDontWantToTypeEveryTime 没有伴生对象。 (当然不是,它是一个Java类。)

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

最佳答案

您可以使用import alias在本地给它一个更方便的名称:

import com.example.aVeryLongNameThatIDontWantToTypeEveryTime as MyShortName

如果您更喜欢范围内的解决方案,那么我认为现在唯一的方法是指定您自己的“范围”:

object aVeryLongNameThatIDontWantToTypeEveryTimeScope {
    inline fun get() = aVeryLongNameThatIDontWantToTypeEveryTime.get()
    inline fun set() = aVeryLongNameThatIDontWantToTypeEveryTime.set()
    inline fun abs() = aVeryLongNameThatIDontWantToTypeEveryTime.abs()
}

with (aVeryLongNameThatIDontWantToTypeEveryTimeScope) {
    get()
    set()
    abs()
}

不幸的是,这需要重写所有函数,包括它们的参数。

将来可以像伴生对象一样使用 Java 静态成员。 Kotlin 的 YouTrack 中也有类似的任务。

关于kotlin - 在 Kotlin 中确定 Java 静态方法的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69675740/

相关文章:

android - 如何获取每个 Kotlin 的当前索引

android - 为什么 CustomTabsClient.bindCustomTabsService 不起作用?

java - 用gradle文件同步项目时出现问题

r - 有什么方法可以访问由 makeActiveBinding 安装的函数?

kotlin - 无需 getter 直接从 Java 访问 kotlin 公共(public)字段

rx-java - RxJava:取消订阅可从另一个异步生产中观察到的异步

r - R 中的作用域和评估函数

C++ pqxx postgresql 离散连接类,作用域类指针

java - 我可以知道我的库何时从 Java 或 Kotlin 调用吗?

java - 在 Kotlin 中仅使用 getter 覆盖 Java 接口(interface)