我有以下方法声明:
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>()
它显示以下编译错误:
AbsSender类型中的方法executeAsync(Method,Callback)不适用于参数(EditMessageReplyMarkup,new SentCallback(){})
为什么我无法将其与new SentCallback<Message>
一起使用?
答案 0 :(得分:9)
首先,让我们看一下T
的推断类型:鉴于您的参数类型(BotApiMethod<Serializable>
和SentCallback<Message>
),应该推断T
Serializable
或Message
。但是,与此同时,当前实施强制两个参数具有完全相同的T
。这就是您当前尝试不起作用的原因。请注意in Java, generics are invariant。
如果您无法更改executeAsync(...)
的给定定义,则您提供的参数无法解决您的问题。
如果参数T
是必不可少的,并且设计允许Method
和Callback
的不同通用参数,只需要有一个共同的超类型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)