此问题来自 javax.validation.ConstraintViolationException 的构造函数的类型。它接受Set<ConstraintViolation<?>>作为参数。

虽然很容易获得一组ConstraintViolation ,其中X是具体类型,但似乎不可能从任何类型良好的API中获得一组“ConstraintViolation ”。而且,如果不使用一些复杂的转换,就不可能将前者转换为后者。 (先类型转换为Set<? extends ConstraintViolation<?>>,然后类型转换为Set<ConstraintViolation<?>>。)

那么你们认为API是错误的还是我错了(为什么)?

最佳答案

API错误。除非实现需要将新的ConstraintViolation<?>添加到集合中,否则它应该接受所有Set<? extends ConstraintViolation<?>>

这是一个示例,说明为什么它更灵活(由Paul Bellora提供,谢谢):

public class Main {

    interface Foo<T> { }

    interface SubFoo<T> extends Foo<T> { }

    static class Bar { }

    public static void main(String[] args) {

        Set<Foo<?>> arg1 = null;
        Set<SubFoo<?>> arg2 = null;
        Set<Foo<Bar>> arg3 = null;
        Set<SubFoo<Bar>> arg4 = null;

        Set<Foo<?>> inflexibleParam;
        inflexibleParam = arg1; //success
        inflexibleParam = arg2; //incompatible types
        inflexibleParam = arg3; //incompatible types
        inflexibleParam = arg4; //incompatible types

        Set<? extends Foo<?>> flexibleParam;
        flexibleParam = arg1; //success
        flexibleParam = arg2; //success
        flexibleParam = arg3; //success
        flexibleParam = arg4; //success
    }
}

(ideone)

关于java - 当参数接受Collection <X <?>>时无法输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18259551/

10-10 12:39