Java 中的“ClassName.class”与 Kotlin 中的“[ClassName::class]”相同吗?

sta*_*iet 5 java android kotlin dagger

在 Android 开发页面的 Dagger 部分,

NetworkModule.classJava 代码的编写方式[NetworkModule::class]与 Kotlin 代码相同。

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

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

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

在“匕首模块”部分,

爪哇代码:

@Component(modules = NetworkModule.class)
public interface ApplicationComponent {
    ...
}
Run Code Online (Sandbox Code Playgroud)

用 Kotlin 编写的相同代码:

@Component(modules = [NetworkModule::class])
interface ApplicationComponent {
    ...
}
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 5

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

翻译成 Java 的 Kotlin 代码将是:

@Component(modules = { NetworkModule.class })
interface ApplicationComponent {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

一般来说,NetworkModule.class在Java中应该翻译成NetworkModule::classwhen in an annotation。但请注意,这是类型KClass。如果你想要一个java.lang.Class,添加.java.

  • @Tenfour04你的意思是[这个](https://kotlinlang.org/docs/reference/annotations.html#constructors)?“如果需要指定一个类作为注释的参数,请使用 Kotlin 类 (KClass)。Kotlin 编译器会自动将其转换为 Java 类” (3认同)