gpt4 book ai didi

java - @NonNullByDefault 返回类型与从 ExecutorService.shutdownNow() 返回的 'List' 不兼容(不匹配空约束)

转载 作者:行者123 更新时间:2023-12-01 09:13:51 26 4
gpt4 key购买 nike

我有一个派生自java.util.concurrent.AbstractExecutorService的类。我的类重写了 shutdownNow()。一切都编译并运行良好。

我将 org.eclipse.jdt.annotation.@NonNullByDefault 添加到类中。我设法修复了除 shutdownNow() 上的 1 个错误之外的所有错误和警告。错误消息显示...

The return type is incompatible with 'List' returned from ExecutorService.shutdownNow() (mismatching null constraints)

快速修复没有任何帮助。

这是有问题的代码。

@NonNullByDefault    // Adding this causes an error
public abstract class ShutdownThreadPool extends AbstractExecutorService implements ExecutorService
{
@Override
public List<Runnable> shutdownNow() // The error is on this line
{
return(Collections.emptyList());
}
}

注意:Collections.emptyList() 不是问题。它只是重现相同错误消息的实际代码的简化。

这是代码的图像。

enter image description here

最佳答案

看来ExecutorService不在任何 @NonNullByDefault 的范围内,对吗?

此外,ExecutorService声明List<Runnable> shutdownNow() .

但是,覆盖会受到 @NonNullByDefault 的影响。使其生效签名@NonNull List<@NonNull Runnable> shutdownNow() .

不幸的是,快速修复仅考虑第一个 @NonNull ,而类型参数上的注释 Runnable实际上导致了不兼容:

我们不知道 ExecutorService.shutdownNow() 的预期语义:客户端是否应该期望返回列表中包含可为空或非空的元素?假设List<@NonNull Runnable>会破坏 shutdownNow() 的潜在调用者喜欢插入null进入结果列表(忽略这意味着奇怪的设计)。

为了使这种覆盖类型安全,应该首先在 super 接口(interface)上引入空注释(在本例中使用外部注释),然后让实现遵循套件。

如果注释 super 接口(interface)由于任何原因都不可行,即继续使用“旧”类型 List<Runnable>如果需要,则可以通过输入 @NonNullByDefault({}) 来取消此方法的空默认值。 ,并手动添加@NonNull仍然需要的地方。

关于java - @NonNullByDefault 返回类型与从 ExecutorService.shutdownNow() 返回的 'List<Runnable>' 不兼容(不匹配空约束),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40727401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com