我有以下方法声明:
public <T extends Serializable,
Method extends BotApiMethod<T>,
Callback extends SentCallback<T>>
void executeAsync(Method method, Callback callback)
Run Code Online (Sandbox Code Playgroud)
当我以下列方式使用它时:
executeAsync(editMessage, new SentCallback() {
Run Code Online (Sandbox Code Playgroud)
它工作正常,但显示类型安全警告.
但是当我提供泛型类型时SentCallback,例如:
executeAsync(editMessage, new SentCallback<Message>()
Run Code Online (Sandbox Code Playgroud)
它显示以下编译错误:
AbsSender类型中的方法executeAsync(Method,Callback)不适用于参数(EditMessageReplyMarkup,new SentCallback(){})
为什么我不能用它new SentCallback<Message>?
首先,让我们看一下推断类型T:给定参数的类型(BotApiMethod<Serializable>和SentCallback<Message>),T应该推断为Serializable或者Message.但是,与此同时,当前的实施强制要求两个参数完全相同T.这就是您当前尝试不起作用的原因.请记住,在Java中,泛型是不变的.
如果您无法更改给定的定义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)
Run Code Online (Sandbox Code Playgroud)
如果参数T不是必需的,则可以完全删除,从而导致以下定义executeAsync(...):
public <Method extends BotApiMethod<? extends Serializable>,
Callback extends SentCallback<? extends Serializable>>
void executeAsync(Method method, Callback callback)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |