首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型混沌Java

泛型混沌Java
EN

Stack Overflow用户
提问于 2015-08-25 15:49:02
回答 2查看 342关注 0票数 7

我使用两个接口:

代码语言:javascript
复制
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中不可能实现过渡通配符。

有什么主意吗?

编辑:为例:

代码语言:javascript
复制
public void register(Receiver<? extends T> receiver){
  Set<Class<? extends T>> interests = receiver.getInterests();
  //Problem because receiver.getInterests is 
  //Set<Class<? extends ? extends T>>
  ...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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>>

票数 7
EN

Stack Overflow用户

发布于 2015-08-25 16:26:24

您可以添加一个使用类型变量而不是通配符的助手方法。

代码语言:javascript
复制
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();
    ...
}

另一方面,方法

代码语言:javascript
复制
    public Set<Class<? extends T>> getInterests();

可能打算返回一个协变量Set,或者,只读集。理想情况下应该使用通配符。

代码语言:javascript
复制
    public Set<? extends Class<? extends T>> getInterests();

但我知道,有太多该死的通配符.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32208483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档