通用捕获
Generic captures
我正在尝试找出编译器抛出错误的原因
test(capture<? extends Serializable>) in Predicate cannot be applied to (Serializable)
test(e.getValue().getData())
以及我如何解决这个问题。
编译器报错的代码如下
private Map<Predicate<? extends Serializable>, TaggedData<? extends Serializable>> scheduledData = new HashMap<>();
public synchronized <T extends Serializable> void conditionalSend(String tag, T data, Predicate<T> condition) {
scheduledData.put(condition, new TaggedData<T>(tag, data));
scheduledData.entrySet()
.stream()
.filter(e -> e.getKey().test(e.getValue().getData()))
.forEach(e -> send(e.getValue()));
}
我的 TaggedData class 是这样定义的
class TaggedData<T extends Serializable> implements Serializable {
private static final long serialVersionUID = 1469827769491692358L;
private final String tag;
private final T data;
TaggedData(String tag, T data) {
this.tag = tag;
this.data = data;
}
String getTag() {
return tag;
}
T getData() {
return data;
}
}
想象一下,您将 Integer
(即 Serializable
)传递给 Predicate<String>
(即 extends Serializable
)?这是毫无意义的。
Predicate#test()
作为消费者,所以你需要使用Predicate<? super Serializable>
。
阅读更多:What is PECS (Producer Extends Consumer Super)?
我正在尝试找出编译器抛出错误的原因
test(capture<? extends Serializable>) in Predicate cannot be applied to (Serializable)
test(e.getValue().getData())
以及我如何解决这个问题。
编译器报错的代码如下
private Map<Predicate<? extends Serializable>, TaggedData<? extends Serializable>> scheduledData = new HashMap<>();
public synchronized <T extends Serializable> void conditionalSend(String tag, T data, Predicate<T> condition) {
scheduledData.put(condition, new TaggedData<T>(tag, data));
scheduledData.entrySet()
.stream()
.filter(e -> e.getKey().test(e.getValue().getData()))
.forEach(e -> send(e.getValue()));
}
我的 TaggedData class 是这样定义的
class TaggedData<T extends Serializable> implements Serializable {
private static final long serialVersionUID = 1469827769491692358L;
private final String tag;
private final T data;
TaggedData(String tag, T data) {
this.tag = tag;
this.data = data;
}
String getTag() {
return tag;
}
T getData() {
return data;
}
}
想象一下,您将 Integer
(即 Serializable
)传递给 Predicate<String>
(即 extends Serializable
)?这是毫无意义的。
Predicate#test()
作为消费者,所以你需要使用Predicate<? super Serializable>
。
阅读更多:What is PECS (Producer Extends Consumer Super)?