我使用两个接口:
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> ==register==> Distributor<String>
我的第一个想法是将寄存器方法更改为register(Receiver<? extends T> receiver).,但是如果我想获得类,则接收方将在方法中进行深入研究,getInterests将返回类似于Set<Class<? extends ? extends T>>的内容。间接地,我得到了类似于Set<Class<? extends T>>的东西,但我经历了在Java中不可能实现过渡通配符。
有什么主意吗?
编辑:为例:
public void register(Receiver<? extends T> receiver){
Set<Class<? extends T>> interests = receiver.getInterests();
//Problem because receiver.getInterests is
//Set<Class<? extends ? extends T>>
...
}发布于 2015-08-25 15:57:12
您的问题是Java泛型是完全不变的,除非您使用? extends或? super通配符使它们变体。
Set<Class<? extends T>>只能保存编译时类型Class<? extends T>的表达式。Class<String>不是Class<? extends T>的相同类型(尽管它可以转换为该类型)。
您需要一个可以容纳可转换为Class<? extends T>的任何类型的集合。
那将是一个Set<? extends Class<? extends T>>
发布于 2015-08-25 16:26:24
您可以添加一个使用类型变量而不是通配符的助手方法。
public void register(Receiver<? extends T> receiver)
{
register2(receiver);
}
private <S extends T> void register2(Receiver<S> receiver)
{
Set<Class<? extends S>> interests = receiver.getInterests();
...
}另一方面,方法
public Set<Class<? extends T>> getInterests();可能打算返回一个协变量Set,或者,只读集。理想情况下应该使用通配符。
public Set<? extends Class<? extends T>> getInterests();但我知道,有太多该死的通配符.
https://stackoverflow.com/questions/32208483
复制相似问题