甲 通配符 表示一个未知类型。
通配符捕获 是将通配符类型的值绑定到新类型变量的过程。例如:
List<?> list = ...;shuffle(list);
哪里
<T> void shuffle(List<T> list) { ...}在此,方法调用后,的未知值将
?绑定到新类型变量,从而允许shuffle方法引用该类型。
T``shuffle
Java编译器通过在匿名类型变量中捕获通配符的值来内部表示通配符的值,该变量称为“捕获的?”。(实际上,javac称它们为“捕获的#1”,因为对的不同用法
?可能引用不同的类型,因此具有不同的捕获)。
好的,那么您的代码出了什么问题?您正在尝试调用方法
<S,T> setCellFactory(Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> factory);
与
Callback<TreeTableColumn<S,?>, TreeTableCell<S, ?>> factory;
在方法签名中,类型参数T代表单个类型,该类型必须由调用方提供。为方便起见,编译器会自动尝试推断合适的值(->类型推断)。您的编译错误意味着编译器无法执行此操作。
在这种情况下,这并不是类型推断的缺点,因为实际上不可能为分配合适的值
T,因为两者都
?必须是的子类型
T,但是编译器无法知道两者
?代表相同的类型,甚至相关类型。
要成功调用此方法,您的参数类型必须对所有出现的T使用相同的类型。如果手头已有这样的类型,请继续使用它。否则,您可以使用通配符捕获来引入一个:
setCellFactory(newFactory());
哪里
<S,T> Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> newFactory() { return new Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> { ... }}


