Kotlin中的TableView回调

我学习使用JavaFX UI控件示例12-12将地图数据添加到表中

它在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); 

但是这部分不能在kotlin中(转换后):

  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 } }) } } 

错误:(49,33)Kotlin:对象必须被声明为抽象或实现抽象成员public abstract fun call(p0:TableColumn>,String>!):TableCell,*>,String>! 在javafx.util.Callback中定义

错误:(50,13)Kotlin:'call'没有覆盖任何东西

错误:(51,24)Kotlin:类型推断失败:构造函数TextFieldTableCell(p0:StringConverter!)不能应用于()

错误:(51,43)Kotlin:类型不匹配:推断的类型只是StringConverter <(??? .. ???)>! 预计

错误:(51,52)Kotlin:在javafx.util中定义的类StringConverter的一个类型参数

错误:(52,21)Kotlin:'toString'不会覆盖任何内容

错误:(56,21)Kotlin:'fromString'不包含任何内容

如何编写正确的代码?

您的类型在TextFieldTableCell中是错误的。

仔细看TextFieldTableCell<S,T> extends TableCell<S,T>和方法TextFieldTableCell(StringConverter<T> converter)

如果回调返回类型是TableCell<Map<*, *>, String>> ,那么你的字符串转换器必须是StringConverter<String>来完成类型约束。

  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` } }) }