簡體   English   中英

不允許使用Java通配符通用嗎?

[英]Java wildcard generic not allowed?

所以我想制作一個util方法,該方法返回一個列表,其中包含ConstraintValidator的錯誤。 我有這種方法:

public static List<String> getViolationsToList(Set<ConstraintViolation<?>> violations) {
    List<String> errors = new ArrayList<>();
    for(ConstraintViolation<?> violation: violations) {
        errors.add(violation.getMessage());
    }

    return errors;
}

但是當我叫它

RestUtil.getViolationsToList(violations);

它不會編譯。 違規類型為:

Set<ConstraintViolation<UserDto>> violations;

有任何想法嗎? Eclipse建議使用UserDto刪除通配符或創建新方法,但是我想使用泛型。

采用

Set<<ConstraintViolation<T>>

然后:

public static <T> List<String> getViolationsToList(Set<ConstraintViolation<T>> violations) {

泛型是不變的。 即使ConstraintViolation<UserDto>ConstraintViolation<?>的子類型, Set<ConstraintViolation<UserDto>>也不是Set<ConstraintViolation<?>>的子類型。 就像List<String>不是List<Object>的子類型一樣,即使StringObject的子類型。

您需要在頂層使用通配符才能獲得類型參數的多態性:

List<String> getViolationsToList(Set<? extends ConstraintViolation<?>> violations) {

再深入一點

OP沒有提及它,但是請注意,由於更好的類型推斷,該代碼在Java 8中有效。

在Java 8中,您可以執行以下操作:

return violations.stream().map(Violation::getMessage).collect(Collectors.toList());

比較優雅

可能您正在嘗試執行以下操作:

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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM