通用混沌Java

CRC*_*CRC 7 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);

}
Run Code Online (Sandbox Code Playgroud)

我想在分销商中注册分销商的问题,例如 Distributor<Object>== register ==>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>>
  ...
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 7

您的问题是Java泛型是完全不变的,除非您使用? extends? super通配符使它们变体.

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

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

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

  • @Codebender:`extends`实际上意味着"可转换为".`Class <String>`可以转换为`Class <?extends Object>`(虽然不是`Class <Object>`;你需要_both_`?extends`通配符). (2认同)