我正在和一个工作人员一起工作TreeTable时,我需要通过一个
Callback<TreeTableColumn<A, capture of ?>, TreeTableCell<A, capture of ?>>
Run Code Online (Sandbox Code Playgroud)
A是我正在使用的课程,但我不知道如何处理"捕获?"
我试图创造
new Callback<TreeTableColumn<A, ?>, TreeTableCell<A, ?>>
Run Code Online (Sandbox Code Playgroud)
但IDEA显示出警告
setCellFactory(Callback<TreeTableColumn<A, capture<?>>, TreeTableCell<A, capture<?>>>) in TreeTableColumn cannot be applied to (anonymous Callback<TreeTableColumn<A, ?>, TreeTableCell<A, ?>>)
Run Code Online (Sandbox Code Playgroud)
我尝试使用特定的类(如String)而不是"?" 同样,但没有任何帮助.
谁能向我解释如何使用它?
谢谢.
编辑:
我聚集了一点点信息.该CellFactory的TreeTableColumn<S,T>应该是Callback<TreeTableColumn<S,T>,TreeTableCell<S,T>>但是,我与原始类型创建工作(在库)的TreeTableColumn.
使用原始类型回调有效.但有没有其他选择如何解决这个问题?
在下面的代码中,get()调用它并将结果分配给类型为的变量List<List<?>>.get()返回a List<List<T>>并在类型参数T设置为的实例上调用?,因此它应该适合.
import java.util.List;
class Test {
void foo(NestedListProducer<?> test) {
List<List<?>> a = test.get();
}
interface NestedListProducer<T> {
List<List<T>> get();
}
}
Run Code Online (Sandbox Code Playgroud)
但IntelliJ IDEA和Oracle的javac1.7.0_45版都拒绝我的代码无效.这是'javac'的错误消息:
java: incompatible types
required: java.util.List<java.util.List<?>>
found: java.util.List<java.util.List<capture#1 of ?>>
Run Code Online (Sandbox Code Playgroud)
为什么这段代码无效,即如果允许则会出错?
我试图了解捕获的转换如何适用于通配符类型.JLS中有一节解释说:
让我们
G使用带有相应边界的n类型参数A1,...,An来命名泛型类型声明(第8.1.2节,第9.1.2节)U1,...,Un.存在从参数化类型
G<T1,...,Tn>(第4.5节)到参数化类型的捕获转换G<S1,...,Sn>,其中,用于1 ? i ? n:
如果
Ti是表单的通配符类型参数(第4.5.1节)?,那么它Si是一个新的类型变量,其上限是Ui[A1:=S1,...,An:=Sn],其下限是null类型(第4.1节).如果
Ti是表单的通配符类型参数? extends Bi,那么它Si是一个新的类型变量,其上限是glb(Bi, Ui[A1:=S1,...,An:=Sn]),其下限是null类型.
glb(V1,...,Vm)被定义为V1 & ... & Vm.它是一个编译时间错误,如果,对任何两个类(未接口)
Vi和Vj,Vi不是的一个子类Vj,或反之亦然.如果
Ti是表单的通配符类型参数? super Bi,那么它Si是一个新的类型变量,其上限是Ui[A1:=S1,...,An:=Sn],其下限是Bi.否则,
Si …
我对使用Eclipse JDT创建CAPTURE绑定感兴趣.
我已经阅读了几个捕获转换教程,但是当我复制粘贴示例代码片段时,我永远无法在抽象语法树中找到捕获转换绑定(使用插件ASTView来可视化AST).
如何实现这一目标?
我在以下代码中遇到了一些麻烦.
public ArrayList<? extends IEvent> getEventsByDateRange(DateTime minStartTime, DateTime minEndTime)
{
ArrayList<? extends IEvent> returnedEvents = new ArrayList<GoogleEvent>();
returnedEvents.add(new GoogleEvent());
return (returnedEvents);
}
Run Code Online (Sandbox Code Playgroud)
这将为"returnedEvents.add(new GoogleEvent());代码行"返回以下编译错误:
方法add(捕获#1-of?extends IEvent)在ArrayList类型中不适用于参数(GoogleEvent)
该课程的声明GoogleEvent如下:
public class GoogleEvent implements IEvent {...}
Run Code Online (Sandbox Code Playgroud)
我知道在Java中使用泛型有一些棘手的部分,因此是通配符,但我似乎无法弄清楚这一点.
谢谢.