Javagenerics“捕获?”

我正在使用TreeTable ,在更换单元工厂时,我需要通过一个

 Callback<TreeTableColumn, TreeTableCell> 

A是我正在使用的课程,但我不知道如何处理“捕获?”

我试图创造

 new Callback<TreeTableColumn, TreeTableCell> 

但IDEA显示出警告

 setCellFactory(Callback<TreeTableColumn<A, capture>, TreeTableCell<A, capture>>) in TreeTableColumn cannot be applied to (anonymous Callback<TreeTableColumn, TreeTableCell>) 

我尝试使用特定的类(如String)而不是“?” 同样,但没有任何帮助。

谁能向我解释如何使用它?

谢谢。

编辑:

我收集了更多信息.. TreeTableColumnCellFactory应该是Callback<TreeTableColumnTreeTableCell> ,但是,我正在使用的TreeTableColumn被创建为原始类型(在库中)。

使用原始类型回调有效。 但有没有其他选择如何解决这个问题?

通配符表示未知类型。

通配符捕获是将通配符类型的值绑定到新类型变量的过程。 例如:

 List list = ...; shuffle(list); 

哪里

  void shuffle(List list) { ... } 

这里,未知值? 在调用shuffle方法时绑定到新类型变量T ,允许shuffle方法引用该类型。

Java编译器通过在匿名类型变量中捕获它来内部表示通配符的值,它称之为“捕获?” (实际上,javac称它们为“捕获#1的?”,因为?的不同用法可能指的是不同的类型,因此具有不同的捕获)。

好的,你的代码有什么问题? 您正在尝试调用方法

  setCellFactory(Callback, TreeTableCell> factory); 

 Callback, TreeTableCell> factory; 

在方法签名中,类型参数T代表单个类型,必须由调用者提供。 为方便起见,编译器会自动尝试推断出合适的值( – >类型推断)。 编译错误意味着编译器无法执行此操作。

在这种情况下,这不是类型推断的缺点,因为实际上不可能为T分配合适的值,因为两者都是? 需要是T子类型,但编译器不能知道这两个? 代表相同类型,甚至相关类型。

要成功调用此方法,您的参数类型必须对所有出现的T使用相同的类型。如果您已经有这样的类型,请继续使用它。 否则,您可以使用通配符捕获引入一个:

 setCellFactory(newFactory()); 

哪里

  Callback, TreeTableCell> newFactory() { return new Callback, TreeTableCell> { ... } } 

从我从什么是捕获转换和oracle捕获通用文档中发现它看起来你正面临着一些问题,编译器无法找到所需的辅助类,或者试图将Object放在那里,但是你给他的东西不能安全转换。

编辑:

DEFAULT_CELL_FACTORY

public static final Callback,TreeTableCell>

如果在TreeTableColumn实例上未指定cellFactory,则默认情况下将使用此实例。 目前,如果该项是一个Node,它只是在图形属性中呈现TableCell项属性,或者如果它不为null则只调用toString(),在文本属性中设置结果字符串。

setCellFactory

public final void setCellFactory(Callback,TreeTableCell> value)

设置属性cellFactory的值。 属性说明:此列中所有单元格的单元工厂。 单元工厂负责为每个TreeTableCell渲染包含在单个TreeTableColumn中的数据。 默认情况下,TreeTableColumn使用默认单元工厂,但可以使用自定义实现替换它,例如以不同方式显示数据或支持编辑。 有很多关于在别处创建自定义单元工厂的文档(例如,参见Cell和TreeTableView)。

最后,javafx.scene.control.cell包中有许多预先构建的单元工厂。

取自Java 8 API Doc 。

所以这样的事情应该朝着正确的方向发展:

 public static  Callback, TableCell> forTableColumn() { return forTableColumn(new DefaultStringConverter()); } 

或类似的东西,取决于你想要给Cell的内容。

 setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter())); 

这些代码片段取自此StackOverflow线程

最后这个链接也可以帮到你: TableView Cell Tutorial

所以这应该让你在黑暗中更多地了解可能导致问题的原因。