【问题标题】:java interface instead of implementationjava接口而不是实现
【发布时间】:2011-06-20 19:57:35
【问题描述】:

我有一个给定参数的方法:

public static Map<String, String> validationMessages(Set<ConstraintViolation<EditEmailForm>> failures) 

现在我想向它添加另一个表单,所以我用一个 Form 接口包围我的所有表单并实现它,并将方法更改为:

public static Map<String, String> validationMessages(Set<ConstraintViolation<Form>> failures) 

现在在我的控制器中,我尝试像这样使用这种方法:

首先我创建一个失败对象,然后进行验证

Set<ConstraintViolation<EditEmailForm>> failures = validator.validate(editEmailForm);

然后尝试将其传递给 validationMessages 方法:

return FormUtils.validationMessages(failures);

但我不能这样做。这里的解决方案是什么?

谢谢

【问题讨论】:

  • 您使用的是特定框架吗?为什么它不起作用?你有什么特殊的例外吗?
  • “但我不能这样”......嗯,为什么不呢?请解释一下
  • FormUtils 类型中的方法 validationMessages(Set>) 不适用于参数 (Set>)

标签: java spring interface


【解决方案1】:

将方法中的声明更改为

public static Map<String, String> validationMessages(Set<ConstraintViolation<? extends Form>> failures)

如果没有帮助,请提供更多详细信息

【讨论】:

  • FormUtils 类型中的方法 validationMessages(Set>) 不适用于参数 (Set>) - 仍然是同样的问题..跨度>
【解决方案2】:

这个问题来自于 java-generics 不是协变的。详情看这里

http://www.ibm.com/developerworks/java/library/j-jtp01255/index.html

想想这个案例。

B 扩展 A。

你调用这个方法

void someMethod(Set<A> as) {
    as.add(new A());
}

Set<B> bs = new HashSet<B>();

someMethod(bs);

如果这样编译,您将能够将 A 添加到 B 集合中。

至于你的具体问题。为什么还要将 Form-Class 作为 ConstraintViolation 的泛型?

【讨论】:

    猜你喜欢
    • 2016-10-24
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2023-01-23
    • 2018-09-04
    • 2014-04-08
    相关资源
    最近更新 更多