通用捕获

时间:2015-10-21 15:21:11

标签: java generics wildcard predicate

我试图找出编译器抛出的原因

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 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;
    }
}

1 个答案:

答案 0 :(得分:1)

想象一下,您将IntegerSerializable)传递给Predicate<String>extends Serializable)?这是毫无意义的。

Predicate#test()用作消费者,因此您需要使用Predicate<? super Serializable>代替。

了解详情:What is PECS (Producer Extends Consumer Super)?