当一个参数接受Collection <X <?>>时不可能输入

bil*_*.cn 6 java generics types

这个问题来自于构造函数的输入javax.validation.ConstraintViolationException.它接受Set<ConstraintViolation<?>>作为参数.

虽然很容易得到一组ConstraintViolation <X>,其中X是具体类型,但似乎不可能从任何类型良好的API获得一组"ConstraintViolation <?>".如果不使用一些复杂的演员阵容,就不可能将前者转换为后者.(铸造Set<? extends ConstraintViolation<?>>然后到Set<ConstraintViolation<?>>.)

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

Ben*_*ulz 4

API 是错误的。除非实现需要将新的ConstraintViolation<?>s 添加到集合中,否则它应该接受所有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
    }
}
Run Code Online (Sandbox Code Playgroud)

创意

  • @PaulBellora 你不能添加任何东西到 `Set&lt;? 扩展任何东西&gt;`。 (2认同)