gpt4 book ai didi

java - 应用类来捕获

转载 作者:行者123 更新时间:2023-12-02 10:46:22 26 4
gpt4 key购买 nike

我在库中有一个界面,如下所示:

public interface Sender<T> {

String send(T parameters);
}

它是一个库,所以我更喜欢一个不改变它的解决方案。现在,有几个类实现了这个接口(interface)。每个类都以 T 扩展类 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)

有什么想法,如何解决这个问题吗?

编辑:修复了较小的复制代码错误

最佳答案

当您不理解通用通配符问题时,解决它们的最简单且通常最好的方法是删除通配符。

因此,正如其他人建议的那样,使用 Sender<ParamsVal> sender相反。

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

Sender<ParamsVal>表示“发送 ParamsVal 对象的发送者”。

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

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

相反,你想要 Sender<? super ParamsVal> 。它的意思是“一个发送者。我不知道它发送什么。但我确实知道无论它发送什么,这些东西都是 ParamsVal 的父类(super class)型,或者可能是 ParamsVal 本身”。

由于发送者可以发送的任何内容都是 ParamsVal 的父类(super class)型,因此我们知道在任何情况下它都可以发送 ParamsVal。

关于java - 应用类来捕获<?扩展类>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52538910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com