此问题来自 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/