java - 使用带有嵌套 "?"泛型类型的 Set 调用 java 方法

标签 java generics collections generic-collections

我在可重用类中有这样的方法:

public String buildMessageForViolation(ConstraintViolation<?> constraintViolation) {
    return constraintViolation.getPropertyPath().toString().replace(".<collection element>", "") + ": " + constraintViolation.getMessage();
}

它是从另一个类调用的,如下所示:

 fieldValidator.appendErrorMessage(getUslValidator().buildMessageWithProperty(constraintViolations.iterator().next()) +
                (constraintViolations.size() > 1 ? ", and other errors" : ""));

因此,由于我希望这个 block 在许多类中重复,所以我想重构它,以便复杂性位于可重用类中,而不是客户端代码中。

因此,我将其添加到可重用类中:

public String buildMessageForViolations(Set<ConstraintViolation<?>> constraintViolations) {
    return buildMessageForViolation(constraintViolations.iterator().next()) +
            (constraintViolations.size() > 1 ? ", and other errors" : "");
}

然后将客户端代码更改为:

fieldValidator.appendErrorMessage(getUslValidator().buildMessageForViolations(constraintViolations));

这不会编译,说:

The method buildMessageForViolations(Set<ConstraintViolation<?>>) in the type USLValidator is not applicable for the arguments (Set<ConstraintViolation<ClientSpecificClassName>>)

显然这与我指定“?”有关。对于嵌套类型参数。从我的角度来看,这是合适的,因为可重用类不关心 ConstraintViolation 的类型参数。

我可以做一些简单的事情来解决这个问题吗?

更新:

我正在阅读发布于此的答案,以及对该答案的后续编辑,但后来由于某种原因被删除(猜测响应者放弃了尝试使其正确)。

虽然答案仍然存在,但它至少帮助我找到了一个合理的解决方法。

客户端代码可以这样做:

fieldValidator.appendErrorMessage(getUslValidator().buildMessageForViolations(new HashSet<ConstraintViolation<?>>(constraintViolations)));

这至少比原来的好一点,尽管仍然有一些人们必须记住的样板文件。

最佳答案

嵌套通配符可能会导致一些意外的不兼容性。试试这个:

public String buildMessageForViolations(Set<? extends ConstraintViolation<?>> constraintViolations) {

关于java - 使用带有嵌套 "?"泛型类型的 Set 调用 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44707674/

相关文章:

java - 将 Collection 对象设为 NULL 好不好?

java - 构建健康指标 spring boot

java - 通用堆栈实现

java - 如何在Activity onCreate中更改ImageView源

java - 支持实现接口(interface)的泛型类的静态函数的最佳设计模式

c# - ViewModelBuilder 泛型类型转换问题

WPF 数据网格 : Binding a Collection Property to Column

java - 比较器和比较器接口(interface)

java - Java中的MySQL连接问题

java - Android:使用两个 ValueEventListener 从 firebase 数据库获取数据(在 Arraylist 过期之前设置适配器)