标签:java generics wildcard capture
我正在使用TreeTable,在更换单元工厂时,我需要通过一个
Callback<TreeTableColumn<A, capture of ?>, TreeTableCell<A, capture of ?>>
A是我正在使用的课程,但我不知道如何处理“捕获?”
我试图创造
new Callback<TreeTableColumn<A, ?>, TreeTableCell<A, ?>>
但IDEA显示出警告
setCellFactory(Callback<TreeTableColumn<A, capture<?>>, TreeTableCell<A, capture<?>>>) in TreeTableColumn cannot be applied to (anonymous Callback<TreeTableColumn<A, ?>, TreeTableCell<A, ?>>)
我尝试使用特定的类(如String)而不是“?”同样,但没有任何帮助.
谁能向我解释如何使用它?
谢谢.
编辑:
我收集了更多信息.. TreeTableColumn的CellFactory< S,T>应该是Callback< TreeTableColumn< S,T>,TreeTableCell< S,T>>,但是,我正在使用的TreeTableColumn被创建为原始类型(在库中).
使用原始类型回调有效.但有没有其他选择如何解决这个问题?
解决方法:
通配符表示未知类型.
通配符捕获是将通配符类型的值绑定到新类型变量的过程.例如:
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>> {
...
}
}
标签:java,generics,wildcard,capture 来源: https://codeday.me/bug/20190928/1828761.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。