¿Es un tipo de propiedad implícita igual con un tipo de propiedad explícito?

El siguiente código A es de Kotlin-for-Android-Developers. El código B está escrito por mí.

¿Funcionan estos dos bloques de código diferentes de la misma manera?

Código A

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

Código B

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

Desde el punto de vista de la estructura , son lo mismo. el comstackdor de Kotlin emitirá el mismo código de byte de Java del código fuente que le gusta a continuación:

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

el tipo de propiedad es opcional en el código B anterior, pero es útil cuando se progtwig por interfaz en lugar de implementación [1] ; si se modificó la implementación, solo se necesita cambiarla donde se instancia, ya que el uso de la toolbar de toolbar puede ' t acceder a las características declaradas por sus subclasss en absoluto. por ejemplo:

 //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>() 

Desde el punto de vista del comstackdor , son diferentes. Dado que el comstackdor inferirá el tipo de propiedad real en el código A en time de compilation, por ejemplo:

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

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