Java 8泛型兼容性

时间:2018-06-09 22:24:14

标签: java java-8

我有以下方法声明:

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>一起使用?

1 个答案:

答案 0 :(得分:9)

首先,让我们看一下T的推断类型:鉴于您的参数类型(BotApiMethod<Serializable>SentCallback<Message>),应该推断T SerializableMessage。但是,与此同时,当前实施强制两个参数具有完全相同的T。这就是您当前尝试不起作用的原因。请注意in Java, generics are invariant

如果您无法更改executeAsync(...)的给定定义,则您提供的参数无法解决您的问题。

如果参数T是必不可少的,并且设计允许MethodCallback的不同通用参数,只需要有一个共同的超类型TexecuteAsync(...)可以更改为:

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)