我有以下方法声明:
public <T extends Serializable,
Method extends BotApiMethod<T>,
Callback extends SentCallback<T>>
void executeAsync(Method method, Callback callback)
当我按以下方式使用它时:
executeAsync(editMessage, new SentCallback() {
它工作正常但显示类型安全警告。
但是当我向 SentCallback
提供通用类型时,比如:
executeAsync(editMessage, new SentCallback<Message>()
它显示以下编译错误:
The method executeAsync(Method, Callback) in the type AbsSender is not applicable for the arguments (EditMessageReplyMarkup, new SentCallback(){})
为什么我不能将它与 new SentCallback<Message>
一起使用?
最佳答案
首先,让我们看一下 T
的推断类型.给定参数类型( BotApiMethod<Serializable>
和 SentCallback<Message>
),T
应该被推断为 Serializable
或 Message
.但与此同时,当前的实现强制两个参数具有完全相同的 T
。 .这就是所提出的尝试不起作用的原因。请记住 in Java, generics are invariant .
如果无法更改 executeAsync(...)
的给定定义,问题无法通过提供的参数解决。
如果参数T
是必不可少的,设计允许 Method
的不同通用参数和 Callback
, 它只需要有一个共同的父类(super class)型 T
, executeAsync(...)
的定义可以更改为:
public <T extends Serializable,
Method extends BotApiMethod<? extends T>,
Callback extends SentCallback<? extends T>>
void executeAsync(Method method, Callback callback)
如果参数T
不是必需的,它可以完全删除,导致以下 executeAsync(...)
的定义:
public <Method extends BotApiMethod<? extends Serializable>,
Callback extends SentCallback<? extends Serializable>>
void executeAsync(Method method, Callback callback)
关于Java 8 泛型兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50779035/