Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不允许使用Java通配符泛型?_Java_Generics_Wildcard - Fatal编程技术网

不允许使用Java通配符泛型?

不允许使用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

所以我想创建一个util方法,它返回一个包含
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编写的。