通用混沌Java

时间:2015-08-25 15:49:03

标签: java generics

我使用两个接口:

public interface Receiver<T> {

  public void receive(T obj);

  public Set<Class<? extends T>> getInterests();

}

public interface Distributor<T> extends Receiver<T> {

 public void register(Receiver<T> receiver);

}

我的问题是我想在分销商中注册分销商,例如 Distributor<Object> ==注册==&gt; Distributor<String>

我的第一个想法是将寄存器方法更改为register(Receiver<? extends T> receiver).但是如果我想获取类,那么接收器对方法有兴趣getInterests会返回类似的东西   Set<Class<? extends ? extends T>>。 间接我得到像Set<Class<? extends T>>这样的东西,但我经历过Java中不可能使用transitiv通配符。

有人有想法吗?

编辑:举个例子:

public void register(Receiver<? extends T> receiver){
  Set<Class<? extends T>> interests = receiver.getInterests();
  //Problem because receiver.getInterests is 
  //Set<Class<? extends ? extends T>>
  ...
}

1 个答案:

答案 0 :(得分:7)

您的问题是Java泛型是完全不变的,除非您使用? extends? super通配符对其进行变换。

Set<Class<? extends T>>只能保存完全符合编译时类型Class<? extends T>的表达式。 Class<String>Class<? extends T>的类型不同(即使它可以转换为该类型)。

您想要一个可以容纳任何可转换为Class<? extends T>的类型的集合。

那将是Set<? extends Class<? extends T>>