bil*_*.cn 6 java generics types
这个问题来自于构造函数的输入javax.validation.ConstraintViolationException
.它接受Set<ConstraintViolation<?>>
作为参数.
虽然很容易得到一组ConstraintViolation <X>,其中X是具体类型,但似乎不可能从任何类型良好的API获得一组"ConstraintViolation <?>".如果不使用一些复杂的演员阵容,就不可能将前者转换为后者.(铸造Set<? extends ConstraintViolation<?>>
然后到Set<ConstraintViolation<?>>
.)
所以你们认为API是错误的还是我错了(以及为什么)?
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)
(创意)
归档时间: |
|
查看次数: |
127 次 |
最近记录: |