不允许使用Java通配符泛型?
所以我想创建一个util方法,它返回一个包含不允许使用Java通配符泛型?,java,generics,wildcard,Java,Generics,Wildcard,所以我想创建一个util方法,它返回一个包含ConstraintValidators中错误的列表。我有这个方法: public static List<String> getViolationsToList(Set<ConstraintViolation<?>> violations) { List<String> errors = new ArrayList<>(); for(ConstraintViolation&l
ConstraintValidator
s中错误的列表。我有这个方法:
public static List<String> getViolationsToList(Set<ConstraintViolation<?>> violations) {
List<String> errors = new ArrayList<>();
for(ConstraintViolation<?> violation: violations) {
errors.add(violation.getMessage());
}
return errors;
}
它不编译。违规行为的类型为:
Set<ConstraintViolation<UserDto>> violations;
设置违规行为;
有什么想法吗?Eclipse建议用UserDto删除通配符或创建新方法,但我想使用泛型。使用
Set<<ConstraintViolation<T>>
设置使用
Set可能是您正在尝试这样做:
public static <T> List<String> getViolationsToList(Set<ConstraintViolation<T>> violations) {
List<String> errors = new ArrayList<>();
for(ConstraintViolation<T> violation: violations) {
errors.add(violation.getMessage());
}
return errors;
}
公共静态列表getViolationsToList(设置冲突){
列表错误=新建ArrayList();
for(约束冲突:冲突){
errors.add(违例.getMessage());
}
返回错误;
}
您可能正试图执行以下操作:
public static <T> List<String> getViolationsToList(Set<ConstraintViolation<T>> violations) {
List<String> errors = new ArrayList<>();
for(ConstraintViolation<T> violation: violations) {
errors.add(violation.getMessage());
}
return errors;
}
公共静态列表getViolationsToList(设置冲突){
列表错误=新建ArrayList();
for(约束冲突:冲突){
errors.add(违例.getMessage());
}
返回错误;
}
要进一步挖掘
OP没有提到它,但请注意,由于更好的类型推断,代码在Java8中工作
在java 8中,您可以执行以下操作:
返回违规.stream().map(违规::getMessage).collect(Collectors.toList())代码>
更优雅一点再深入一点
OP没有提到它,但请注意,由于更好的类型推断,代码在Java8中工作
在java 8中,您可以执行以下操作:
返回违规.stream().map(违规::getMessage).collect(Collectors.toList())代码>
更优雅一点的是泛型是不变的<代码>集合
不是集合
的子类型。这就像列表
不是列表
的子类型一样,即使字符串
是对象
的子类型
为了获得类型参数的多态性,您需要在顶层使用通配符:
List<String> getViolationsToList(Set<? extends ConstraintViolation<?>> violations) {
List getViolationsToList(设置>冲突){
泛型是不变的。Set
不是Set
的子类型。这就像List
不是List
的子类型一样,即使String
是对象的子类型
为了获得类型参数的多态性,您需要在顶层使用通配符:
List<String> getViolationsToList(Set<? extends ConstraintViolation<?>> violations) {
List getViolationsToList(设置>冲突){
尝试使用:SetTry:SetThis显然不会编译。尽管字符串确实继承了对象,但ConstraintViolation不会继承ConstraintViolation。我尝试了并?扩展了对象,但仍然不起作用。@AdamKortylewicz我想使其通用,适用于所有DTO。硬编码给定的DTO不是一个好主意。顶级DTO类型是什么e调用,然后?Dto
?尝试使用:SetTry:SetThis显然不会编译。尽管字符串确实继承了对象,但ConstraintViolation不会继承ConstraintViolation。我尝试了并扩展了对象,但仍然不起作用。@AdamKortylewicz我想使其通用,适用于所有Dto。硬编码给定的Dto不是一个好主意。Wh在调用的顶级DTO类型中,那么?DTO
?不起作用,但仅使用T有效。非常感谢。公共静态列表getViolationsToList(设置冲突){不起作用,但仅使用T有效。非常感谢。公共静态列表getViolationsToList(设置冲突){是的,我没有提到这个项目是用java 7编写的。是的,我没有提到这个项目是用java 7编写的。