应用Class捕获<!-?扩展类->

时间:2018-09-27 14:04:19

标签: java

我在库中有一个接口,如下所示:

public interface Sender<T> {

  String send(T parameters);
}

这是一个库,所以我更喜欢一个无需更改的解决方案。 现在,有几个类可以实现此接口。每个类都以T扩展Class ParamsVal的方式实现它。

现在,我想实现一个队列,在该队列中可以保存适合参数的数据,并在确定的时间内调用send()(我需要返回值String,因此不能简单地使用Runnable和线程)。

因此,我创建了一个像这样的类:

public class MessageEntry{
  private ParamsVal messageParameters;
  private Sender<? extends ParamsVal> sender;


  public MessageEntry(ParamsVal messageParameters, Sender<? extends ParamsVal> sender) {
      this.messageParameters = messageParameters;
      this.sender = sender;
  }

  public String send(){
      return this.sender.send(this.messageParameters);
  }
}

使用send()的return-Line时出现错误

 send(capture<? extends ParamsVal>) in Sender cannot be applied to (ParamsVal)

任何想法,如何解决?

编辑:修复了次要copycodeerror

1 个答案:

答案 0 :(得分:1)

在您不了解通用通配符问题时,最简单,通常是最好的方法是删除通配符。

因此,正如其他人建议的那样,请改用Sender<ParamsVal> sender

现在,关于正在发生的事情,以及如果您想尽可能灵活地做些什么,可以做些什么。

Sender<ParamsVal>的意思是“发送ParamsVal对象的发件人”。

Sender<? extends ParamsVal>的意思是“发件人。我不知道它发送的是什么。但是我确实知道,无论发送什么,它都是ParamsVal的子类型,或者可能是ParamsVal本身。”

我们不知道它可以发送什么,因此我们不能要求它发送ParamsVal对象。那可能不是它可以发送的对象。我们确实知道它可以发送的对象类型对此进行了扩展。但这不是有用的信息。

相反,您需要Sender<? super ParamsVal>。它的意思是“发件人。我不知道它发送的是什么。但是我确实知道,无论发送什么,它都是ParamsVal的超类型,或者可能是ParamsVal本身。”

由于发送者可以发送的任何东西都是ParamsVal的超类型,因此我们知道在任何情况下它都可以发送ParamsVal。