(How)我可以用Java Generics做到这一点吗?

时间:2010-09-29 11:30:10

标签: java generics

我想在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 个答案:

答案 0 :(得分:3)

是的,您展示的解决方案,无论多么详细,都是实现这一目标的唯一方法。您必须在参数列表中列出所有泛型类型参数,包括嵌套的参数。

答案 1 :(得分:0)

您只能在通用定义

中使用此功能

答案 2 :(得分:0)

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

这可能是非优化设计的标志:Validator界面究竟是什么?很难看到因为你的例子不完整:它根本不使用你的B类型参数。它是关于验证A还是关于验证主题?如果两者兼而有之,那么它可能会混合两个不应该混合的问题吗?