Java 8泛型兼容性

ale*_*oid 7 java java-8

我有以下方法声明:

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>

Tur*_*g85 9

首先,让我们看一下推断类型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)