¿Por qué son válidos tanto val box1 como val box2 en Kotlin?

Soy un principiante de Kotlin, el siguiente código es de una página web, el val box3 es correcto.

y me dijeron que tanto val box1 como val box2 también son correctos. ¿Por qué?

class Box<T>(val value: T) val box1: Box<Int> = Box<Int>(1) val box2: Box<Int> = Box(1) val box3 = Box(1) 

Todas estas tres líneas son "correctas" y crean exactamente las mismas instancias de la misma manera. Simplemente utilizan varios niveles de inferencia de tipo que proporciona Kotlin (es decir, puede averiguar los types y types de arguments desde el context en sí mismo), desde el primero más detallado hasta el último más conciso.

Dado que no hay absolutamente ninguna diferencia en lo que hacen estas líneas, depende de su preference utilizar la que sea más legible para usted.

Son correctos pero no siempre iguales. Déjalos pasar uno a uno.

 val box1: Box<Int> = Box<Int>(1) val box3 = Box(1) 

El primero declara que box1 es Box<Int> mientras que box3 permite al comstackdor averiguar cuál es su tipo. No son siempre lo mismo. Considere Box<T> implemente una interfaz IBox<T> .

 val box1: IBox<Int> = Box<Int>(1) val box3 = Box(1) 

box1 puede ser cualquier object que implemente IBox, mientras que box3 es Box<Int> .

 Box<Int>(1) Box(1) 

Esto es similar al de arriba. El primero declara explícitamente y el segundo deja que el comstackdor lo descubra. Como 1 es Int , entonces son lo mismo. Pero también, esto no siempre es verdad.

 Box<Number>(1) Box(1) 

Esto hace que el primero sea un Box<Number> lugar de un Box<Int>

Parece que Kotlin está deduciendo el tipo en function del valor que proporciones para el constructor de Box. Todos son válidos porque el comstackdor puede darse count de que el tipo genérico T va a ser un tipo Int . Puede haber algunas optimizaciones en time de compilation si es más explícito, pero creo que es principalmente una cuestión de preference.

El parámetro de valor 1 del constructor tiene el tipo T , y Box<T> tiene el mismo parámetro de tipo T

El comstackdor sabe que 1 tiene el tipo Int , por lo que T = Int , por lo que Box(1) = Box<Int>(1) .

El tipo de Box<Int>(1) es Box<Int> trivialmente, por lo que tanto box2 como box3 tienen el tipo Box<Int> .

  • Los enlaces de fábrica Kodein están lanzando NotFoundException
  • ¿Cómo get la class Java del param del método genérico?
  • manejar un object que puede devolver nulo en kotlin
  • Usando un socket para un protocolo personalizado sobre tcp
  • ¿Cómo ejecutar código si el object es nulo?
  • Kotlin requiere biblioteca con Gradle Build
  • Android create listitem / object con información guardada de otra actividad
  • No se pudo escribir JSON: no se pudo deserializar; la exception anidada es
  • ¿Cómo crear caching / versión caliente de rx.Single?
  • Cómo mostrar datos usando la vista de tree de TornadoFX
  • Java vs Kotlin - Spring @Async methods en la misma class