代码之家  ›  专栏  ›  技术社区  ›  Nathan

@NonNullByDefault返回类型与ExecutorService返回的“List<Runnable>”不兼容。Shutdownow()(空约束不匹配)

  •  0
  • Nathan  · 技术社区  · 8 年前

    我有一个从 java.util.concurrent.AbstractExecutorService .我的类重写 shutdownNow() .一切都正常运行。

    我补充道 org.eclipse.jdt.annotation.@NonNullByDefault 去上课。我设法修复了所有的错误和警告,除了上的1个错误 Shutdownow() .错误消息显示。。。

    (空约束不匹配)

    快速修复没有任何帮助。

    以下是违规代码。

    @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());
       }
    }
    

    注:集合。emptyList()不是问题所在。这只是复制相同错误消息的实际代码的简化。

    这是代码的图像。

    enter image description here

    1 回复  |  直到 8 年前
        1
  •  1
  •   Stephan Herrmann    8 年前

    看来 ExecutorService 不在任何 @NonNullByDefault 正当

    此外 执行服务 宣告 List<Runnable> shutdownNow() .

    @默认为非空 制作其有效签名 @NonNull List<@NonNull Runnable> shutdownNow() .

    @NonNull Runnable 实际上导致了不兼容性:

    我们不知道 ExecutorService.shutdownNow() :客户端应该在返回的列表中预期可空或非空元素吗?假设 List<@NonNull Runnable> shutdownNow() 希望插入 null 进入结果列表(忽略这意味着的奇怪设计)。

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

    如果出于任何原因无法注释超级界面,即继续使用“遗留”类型 List<Runnable> 如果需要,则可以通过以下方式取消此方法的空默认值 @NonNullByDefault({}) ,并手动添加 @非空 其中仍然需要。