隐式属性类型是否与显式属性类型相同?

以下代码A来自Kotlin for Android开发人员。 代码B是由我写的。

这两个不同的代码块的功能是一样的吗?

代码A

class DetailActivity : AppCompatActivity(), ToolbarManager { override val toolbar by lazy { find<Toolbar>(R.id.toolbar) } ... } 

代码B

 class DetailActivity : AppCompatActivity(), ToolbarManager { override val toolbar: Toolbar by lazy { find<Toolbar>(R.id.toolbar) } ... } 

One Solution collect form web for “隐式属性类型是否与显式属性类型相同?”

结构上看,它们是一样的。 Kotlin编译器将会发出与源代码相同的Java字节代码,如下所示:

 private final Lazy<Toolbar> toolbarProvider = lazy(()-> find(R.id.toolbar)); public Toolbar getToolbar(){ return toolbarProvider.getValue(); } 

在上面的代码B中属性类型是可选的,但是当通过接口而不是实现编程时,它是有用的,如果实现被改变了,唯一需要改变的是实例化的地方,因为toolbar的使用可以'根本无法访问其子类声明的功能。 例如:

 //declare as abstract supertype ---v override val toolbar: AbstractToolbar by lazy { find<Toolbar>(R.id.toolbar) } // ^ //when implementation was changed only need to change here. //eg:change the `Toolbar` to other subtype of AbstractToolbar: find<MiniToolbar>() 

编译器的角度来看,它们是不同的。 由于编译器会在编译时推断代码A中的实际属性类型,例如:

 // v--- the property type `Toolbar` is inferred at compile-time override val toolbar/*:Toolbar*/ by lazy { find<Toolbar>(R.id.toolbar) } 

[1]: https : //en.wikipedia.org/wiki/Liskov_substitution_principle

  • 测试类中的java.util.logging.Logger
  • IntelliJ:Kotlin没有自动完成功能?
  • Mockito嘲笑像间谍:Kotlin
  • 从活动调用视图寻呼机片段中的函数
  • 将MainActivity转换为Kotlin之后的后续构建中的ClassNotFoundException
  • 在Kotlin中,为什么jackson在某些情况下未能解组未注释的对象,而不是在其他情况下
  • 如何访问Java中的Kotlin伴侣对象?
  • 如何从Corda的自定义表中获取数据
  • 定义null局部变量时需要没有错误,稍后在方法中进行设置
  • kotlin android - Xposed IllegalArgumentException'android.content.res.CoollifeUITpedArray'
  • ImageIO无法读取输入文件(Kotlin)
  • Kotlin language will be the best programming language for Android.