【问题标题】:is 'ClassName.class' in Java same as '[ClassName::class]' in Kotlin?Java 中的“ClassName.class”与 Kotlin 中的“[ClassName::class]”是否相同?
【发布时间】:2020-12-08 01:10:35
【问题描述】:

在 Android 开发页面的 Dagger 部分中,

Java 代码中的NetworkModule.class 在 Kotlin 代码中写为 [NetworkModule::class]

  1. 我认为 Java 中的 NetworkModule.class 应该是 Kotlin 中的 NetworkModule::class.java,不是吗?

  2. 为什么要使用方括号([])?我认为它与get 相同,但我们为什么需要它呢?

我在读这个:https://developer.android.com/training/dependency-injection/dagger-android#java

在“匕首模块”部分,

Java 代码:

@Component(modules = NetworkModule.class)
public interface ApplicationComponent {
    ...
}

用 Kotlin 编写的相同代码:

@Component(modules = [NetworkModule::class])
interface ApplicationComponent {
    ...
}

【问题讨论】:

    标签: java android kotlin dagger


    【解决方案1】:

    这是仅在注释中支持的array literal syntax,在 Kotlin 1.2 中添加。您可以使用它将事物数组传递给注释。所以[NetworkModule::class] 实际上是一个包含单个元素的数组,即NetworkModule::class

    翻译成 Java 的 Kotlin 代码是:

    @Component(modules = { NetworkModule.class })
    interface ApplicationComponent {
        ...
    }
    

    只是{}括号可以在Java中省略,当数组中有单个元素时。但是,您不能只在 Kotlin 中编写 NetworkModule::class。你必须明确地说它是一个数组,使用[]arrayOf等方式,除非它是value参数,在这种情况下它被翻译为vararg

    一般来说,Java 中的NetworkModule.class 在注解中应该被翻译成NetworkModule::class。但请注意,这是KClass 类型。如果您想要java.lang.Class,请添加.java

    【讨论】:

    • 我认为(但找不到文档来确认)在注释参数的世界中,Kotlin 在 KClass 和 Class 之间进行映射,就像它在标准代码中的其他几个类之间进行映射一样。
    • @Tenfour04 你的意思是this? “如果需要指定一个类作为注解的参数,请使用 Kotlin 类(KClass)。Kotlin 编译器会自动将其转换为 Java 类”
    • 解释清楚!非常感谢。那么,我们不必添加 .java 的原因是 Kotlin 编译器在涉及注解的参数时会自动将其转换为 Java 类?谢谢,Sweeper 和 Tenfour04 :)
    猜你喜欢
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2011-10-07
    • 2011-09-28
    相关资源
    最近更新 更多