Sintaxis de la function de Kotlin

Estoy haciendo las testings de Kotlin Koans para familiarizarme con Kotlin. En cierta testing, tengo que anular el método compareTo . En el primer caso, todo funciona según lo previsto

 data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) { operator fun compareTo(other: MyDate)= when { year != other.year -> year - other.year month != other.month -> month - other.month else -> dayOfMonth - other.dayOfMonth } } 

Ahora, en el segundo caso en el que estoy escribiendo la compareTo un poco diferente obtengo una tonelada de errores de compilation.

 data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) { operator fun compareTo(other: MyDate){ when { year != other.year -> return year - other.year month != other.month -> return month - other.month else -> return dayOfMonth - other.dayOfMonth } } } 

En primer lugar, en la palabra key operador, aparece un error:

El modificador 'operador' no es aplicable en esta function: debe devolver Int

y en los retornos que obtengo

Tipo no coincidente: tipo inferido es Int pero se esperaba unidad

No puedo entender por qué ocurren estos errores ya que la primera implementación devuelve los mismos Int s

Eso es porque = funciona como { return X } Esto se aplica solo a las definiciones de funciones . Entonces esto significa que en el primer ejemplo su código es igual a este

 operator fun compareTo(other: MyDate):Int { return when { year != other.year -> year - other.year month != other.month -> month - other.month else -> dayOfMonth - other.dayOfMonth } } 

Pero en tu segundo ejemplo, no devuelves el resultado del when . Esto hace que el comstackdor se confunda porque esperaba que devolviera una Unit Int pero devuelva la Unit (equivalente al void de Java)

Entonces, todo lo que necesita hacer es agregar un tipo de retorno explícito ( Int en este caso) ( fun X(/*args*/) : Int u otro tipo aplicable)

En su primer ejemplo, el tipo de retorno de compareTo(MyDate) se deduce como Int porque todas las twigs de la expresión when devuelven un Int .

En su segundo ejemplo, el tipo de retorno de compareTo(MyDate) es Unit . Como su function tiene el cuerpo del bloque, el tipo de retorno debe especificarse explícitamente (a less que esté destinado a devolver la Unit ). Por lo tanto, aquí se espera la Unit para el tipo de devolución, pero el tipo de retorno inferido de su expresión when es Int . Es por eso que obtienes el error:

Tipo no coincidente: tipo inferido es Int pero se esperaba unidad

Aquí está la explicación oficial para definir explícitamente el tipo de retorno de funciones con cuerpos de bloque:

Las funciones con cuerpo de bloque siempre deben especificar los types de retorno explícitamente, a less que esté destinado a devolver la unidad, en cuyo caso es opcional . Kotlin no deduce types de retorno para funciones con cuerpos de bloque porque tales funciones pueden tener un flujo de control complejo en el cuerpo, y el tipo de retorno no será obvio para el lector (y algunas veces incluso para el comstackdor).

Por lo tanto, la forma correcta de declarar compareTo(MyDate) es especificar el tipo de retorno de la function si incluye el cuerpo del bloque:

 operator fun compareTo(other: MyDate): Int { when { year != other.year -> return year - other.year month != other.month -> return month - other.month else -> return dayOfMonth - other.dayOfMonth } } 

Esto resuelve otro error al mismo time ya que se requiere que el operador de comparación devuelva un valor de Int .

Solo una adición a la respuesta de @Mibac : Puedes hacer esto un poco más corto:

 operator fun compareTo(other: MyDate) = when { year != other.year -> year - other.year month != other.month -> month - other.month else -> dayOfMonth - other.dayOfMonth } 
  • ¿Hay alguna manera de pasar una reference de function entre actividades?
  • ¿Cuál es la forma legítima de get annotations de una propiedad pura de Kotlin a través de la reflexión, siempre faltan?
  • Actualizando la Vista de Reciclador y Creando Parcelables para la rotation de la pantalla (¿Cuál es el mejor curso de acción aquí?)
  • Kotlin ve el nombre completo del tipo de object en el estudio de Android en Mac OS
  • En Android Java / Kotlin, ¿la implementación de una interfaz le da acceso directo a las variables locales de la class de anidación?
  • Error de configuration de Kotlin
  • ¿Hay alguna forma mejor de acceder a la propiedad que se puede anotar?
  • No se puede generar un nuevo proyecto con el generador yeoman Gradle + Kotlin
  • ¿Qué hacer en Espresso cuando el recyclerView devuelve AmbiguousViewMatcherException?
  • SupportfragmentManager se convierte en null android kotlin
  • No se puede comstackr Android Project con Kotlin en TeamCity