Java 8 泛型兼容性

标签 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>()

它显示以下编译错误:

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应该被推断为 SerializableMessage .但与此同时,当前的实现强制两个参数具有完全相同的 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/

相关文章:

java - 关于Customer Annotation Processor,为什么getElementsAnnotatedWith()返回的set大小为0

Java 8 根据条件应用流过滤器

java - Java 中的泛型

java - 露天 : Access to properties file from java class

java-8 - 使用带有列表列表的平面 map

java - 如何在 Java 中搜索映射以查找与谓词匹配的键?

java - pretty-print XML 文件

java - 如何使 TestNG 报告显示软断言失败的行

java - 是否有一个固定大小的队列可以删除过多的元素?

java - 找不到 bean : “studentList” in any scope