Retrollamada TableView en Kotlin

Aprendo Usando Controles de UI JavaFX Ejemplo 12-12 Añadiendo Datos de Mapa a la Tabla

Sus trabajos en java:

TableColumn<Map, String> firstDataColumn = new TableColumn<>("Class A"); TableColumn<Map, String> secondDataColumn = new TableColumn<>("Class B"); firstDataColumn.setCellValueFactory(new MapValueFactory(Column1MapKey)); firstDataColumn.setMinWidth(130); secondDataColumn.setCellValueFactory(new MapValueFactory(Column2MapKey)); secondDataColumn.setMinWidth(130); TableView table_view = new TableView<>(generateDataInMap()); table_view.setEditable(true); table_view.getSelectionModel().setCellSelectionEnabled(true); table_view.getColumns().setAll(firstDataColumn, secondDataColumn); Callback<TableColumn<Map, String>, TableCell<Map, String>> cellFactoryForMap = new Callback<TableColumn<Map, String>, TableCell<Map, String>>() { @Override public TableCell call(TableColumn p) { return new TextFieldTableCell(new StringConverter() { @Override public String toString(Object t) { return t.toString(); } @Override public Object fromString(String string) { return string; } }); } }; firstDataColumn.setCellFactory(cellFactoryForMap); secondDataColumn.setCellFactory(cellFactoryForMap); 

Pero esta parte no funciona en kotlin (después de la conversión):

  val cellFactoryForMap = object : Callback<TableColumn<Map<*, *>, String>, TableCell<Map<*, *>, String>> { override fun call(p: TableColumn<*, *>): TableCell<*, *> { return TextFieldTableCell(object : StringConverter() { override fun toString(t: Any): String { return t.toString() } override fun fromString(string: String): Any { return string } }) } } 

Error: (49, 33) Kotlin: el object debe declararse abstracto o implementar una llamada abstracta abstracta pública miembro (p0: TableColumn>, String>!): TableCell, *>, String>! definido en javafx.util.Callback

Error: (50, 13) Kotlin: 'llamada' no anula nada

Error: (51, 24) Kotlin: Falló la inferencia de tipo: el constructor TextFieldTableCell (p0: StringConverter!) No se puede aplicar a ()

Error: (51, 43) Kotlin: Tipo de discrepancia: el tipo inferido es pero StringConverter <(??? .. ???)>! era de esperarse

Error: (51, 52) Kotlin: un tipo de argumento esperado para la class StringConverter definido en javafx.util

Error: (52, 21) Kotlin: 'toString' no anula nada

Error: (56, 21) Kotlin: 'fromString' no anula nada

¿Cómo escribir el código correcto?

Tu tipo está mal en TextFieldTableCell.

Ver de cerca TextFieldTableCell<S,T> extends TableCell<S,T> y el método TextFieldTableCell(StringConverter<T> converter)

si el tipo de retorno de callback es TableCell<Map<*, *>, String>> , entonces su convertidor de cadena DEBE ser StringConverter<String> para cumplir con la restricción de tipo.

  Callback<TableColumn<Map<*, *>, String>, TableCell<Map<*, *>, String>> { TextFieldTableCell(object: StringConverter<String>() { override fun fromString(string: String): String { return string } override fun toString(`object`: String): String { return `object` } }) }