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? = null
variablesvar human : Human? = null
var human : Human? = null
它将无法建立。
所以,这是一个kotlin
的错误? 或官方文件的错误?
-
“默认可见性是
public
”只是意味着如果你不指定可见性,就和指定public
。 -
属性对应于反编译代码中的getter和setter方法(
getHuman()
和setHuman()
),而不是真正的human
字段。 -
这个文档讨论Kotlin的可视性,这与根据JVM的可见性不一样(也不可能,因为JVM没有
internal
可见性)。 JVM可见性只是实现细节(就本文档而言)。
从2和3一起,引用的文件说什么都不支持甚至存在的支持领域,没关系它的知名度,这正是匕首关心的。 相反,它在https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html中有记录 :
-
在第一部分,“属性”:
一个私有字段,与属性名称相同(仅用于具有后续字段的属性)。
-
在“实例字段”中:
如果您需要将Kotlin属性公开为Java中的字段,则需要使用@JvmField批注对其进行注释。 该字段与底层属性具有相同的可见性。
和
后期初始化属性也暴露为字段。 该字段的可见性将与lateinit属性设置器的可见性相同 。
在Dagger2我注入的财产必须是私人的
你确定? AFAIK领域需要public
,而lateinit var human: Human
应该是好的。
我自己解决了我的问题。
其实kotlin的公共意思是私人+ getter和setter,private是私人没有getter和setter。 官方文件没有明确解释。
所以,它在Calling Kotlin from Java
这一章中增加了一些解释,这意味着如果你希望你的属性是公共的,你可以使用@JvmField
或者lateinit var
这是我的错,我没有仔细阅读文件