¿Por qué este tipo necesita un lanzamiento explícito?

He creado una function de extensión para JavaFX TableColumn que lo hace más conciso para implementar una cellFactory sin la repetitiva repetición. La function de extensión se define así:

inline fun <S, T> TableColumn<S, T>.cellFormat(crossinline formatter: (TableCell<S, T>.(T) -> Unit)) { cellFactory = Callback { column: TableColumn<S, T> -> object : TableCell<S, T>() { override fun updateItem(item: T, empty: Boolean) { super.updateItem(item, empty) if (item == null || empty) { text = null graphic = null } else { formatter(this, item) } } } } } 

Para formatear un TableCell, solo necesito definir lo que debería suceder en TableCell.updateItem cuando hay un elemento no nulo disponible para la celda actual. Para formatear un LocalDateTime por ejemplo, ahora puedo escribir:

 column.cellFormat { text = DateTimeFormatter.ISO_DATE_TIME.format(it) } 

Luego pasé a definir otra extensión que hace justamente esto, así que solo puedo escribir:

 column.formatAsDateTime() 

Esta function usa la primera function, como esta:

 fun <S, LocalDateTime> TableColumn<S, LocalDateTime>.formatAsDateTime() = cellFormat { value -> text = DateTimeFormatter.ISO_DATE_TIME.format(value as TemporalAccessor) } 

Mi pregunta es ¿por qué tengo que convertir LocalDateTime en TemporalAccessor?

Mi primer bash fue:

 text = DateTimeFormatter.ISO_DATE_TIME.format(value) 

El comstackdor se queja:

Tipo no coincidente: el tipo inferido es LocalDateTime pero java.time.TemporalAccessor! era de esperarse

Por supuesto, la function de formatting DateTimeFormatter # toma un TemporalAccessor, no un LocalDateTime, pero LocalDateTime sí implementa TemporalAccessor (a través de Temporal).

La conversión a TemporalAccessor solo se necesita en la function de extensión formatAsDateTime, no cuando se usa cellFormat directamente desde el sitio de llamadas.

¿No debería Kotlin ser capaz de realizar este lanzamiento inteligente automáticamente?