我该如何使用Java泛型来实现这个?

4
我希望在Java中实现以下功能,但不知道该搜索什么:
public interface Subject<T> {
}

public interface EMailAddress extends Subject<String> {
}

public interface Validator<T extends Subject<V>> {
  Set<InputErrors> validate(final V thing); // this does not compile
}

我基本上希望Validator#validate方法的参数类型与Subject的泛型类型相同。

我可以这样写:

public interface Validator<A,B extends Subject<A>> {

  Set<InputErrors> validate(final A thing);
}

但是这将需要我像这样声明实例,这似乎很啰嗦。
 private Validator<String,EMailAddress> validator;
3个回答

3

是的,你展示的解决方案虽然冗长,但这是使其工作的唯一方法。您必须在参数列表中列出所有通用类型参数,包括嵌套的参数。


0
只能在泛型定义中使用这个函数的所有类型。

0

无法引用嵌套类型参数。如果您需要X和Subject作为类型参数,则需要两个类型参数。

这可能是非最优设计的迹象:验证器接口真正关注的是什么?很难看出来,因为您的示例不完整:它根本不使用您的B类型参数。它是关于验证A还是关于验证Subjects?如果两者都是,那么它可能混合了两个不应该混合的问题?


我来澄清一下:我想通过服务定位器获取一个 Validator<EMailAddress>。 - msung
[...] 我试图区分我想要验证的内容(电子邮件地址,用户名,电话号码),以及它在这个上下文中的表示方式(在这里作为字符串,当验证ID时可能是整数)。 - msung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接