kotlin可见性修饰符不匹配

在这里输入图像说明

这是官方文件说的。 但是当我做这样的事情:

var human : Human? = null 

并反编译成java代码,我发现它实际上是

 @Nullable private Human human; 

写这个没用

 public var human : Human? = null 

但是当我写这个:

 lateinit var human : Human 

它这次成为公众

 @NotNull public Human human; 

当我使用Dagger2时,这是个大问题

在Dagger2中,注入的属性必须公开,但是如果我写var human : Human? = nullvariablesvar human : Human? = null var human : Human? = null它将无法建立。

所以,这是一个kotlin的错误? 或官方文件的错误?

  1. “默认可见性是public ”只是意味着如果你不指定可见性,就和指定public

  2. 属性对应于反编译代码中的getter和setter方法( getHuman()setHuman() ),而不是真正的human字段。

  3. 这个文档讨论Kotlin的可视性,这与根据JVM的可见性不一样(也不可能,因为JVM没有internal可见性)。 JVM可见性只是实现细节(就本文档而言)。

从2和3一起,引用的文件说什么都不支持甚至存在的支持领域,没关系它的知名度,这正是匕首关心的。 相反,它在https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html中有记录 :

  1. 在第一部分,“属性”:

    一个私有字段,与属性名称相同(仅用于具有后续字段的属性)。

  2. 在“实例字段”中:

    如果您需要将Kotlin属性公开为Java中的字段,则需要使用@JvmField批注对其进行注释。 该字段与底层属性具有相同的可见性。

    后期初始化属性也暴露为字段。 该字段的可见性将与lateinit属性设置器的可见性相同

在Dagger2我注入的财产必须是私人的

你确定? AFAIK领域需要public ,而lateinit var human: Human应该是好的。

我自己解决了我的问题。

其实kotlin的公共意思是私人+ getter和setter,private是私人没有getter和setter。 官方文件没有明确解释。

所以,它在Calling Kotlin from Java这一章中增加了一些解释,这意味着如果你希望你的属性是公共的,你可以使用@JvmField或者lateinit var

这是我的错,我没有仔细阅读文件