Java泛型通配符运算符

时间:2016-05-29 01:21:03

标签: java validation

我正在尝试编写一个实用程序方法来帮助我为我的应用程序中的bean验证建立异常消息以解决任何验证错误。当我去验证我的对象(在这种情况下,BasicContactInformation)时,我按如下方式进行:

Set<ConstraintViolation<BasicContactInformation>> constraintViolations = validator.validate(basicContactInformation);
        if(!CollectionUtils.isEmpty(constraintViolations)){
            throw new CustomerAccountException(LoggingUtils.getLoggingOutput("Unable to update customer contact information", constraintViolations));
        }

我正在为其他bean做同样的事情。该实用程序方法将获取异常消息的前缀以及约束验证集,并将构建格式良好的输出消息。问题是,我无法弄清楚如何构建消息,以便它可以接受任何类型的一组约束违规。我尝试了以下内容,但它似乎没有效果,因为它说不能投射:

public static String getLoggingOutput(String prefix, Set<ConstraintViolation<?>> violations){
    StringBuilder outputBuilder = new StringBuilder(prefix);
    if(!CollectionUtils.isEmpty(violations)){
        for(ConstraintViolation<?> currentViolation: violations){
            outputBuilder.append("[");
            outputBuilder.append(currentViolation.getMessage());
            outputBuilder.append("]");
        }
    }
    return outputBuilder.toString();
}

这是编译器错误

The method getLoggingOutput(String, Set<ConstraintViolation<?>>) in the type LoggingUtils is not applicable for the arguments (String, Set<ConstraintViolation<BasicContactInformation>>)

知道方法签名应该是什么,以便它适用于任何一组约束违规?我试图避免编写一个方法,为foo接受一组约束违规,一个用于bar,一个用于baz等。

1 个答案:

答案 0 :(得分:1)

您可以使方法通用:

public static <T> String getLoggingOutput(String prefix,
        Set<ConstraintViolation<T>> violations) {
    // ...
}

在大多数情况下,如果不是全部,编译器将从参数中推断出类型参数。这与使用通配符完全不同。