@NonNullByDefault返回类型与&#39; List <runnable>&#39;不兼容从ExecutorService.shutdownNow()返回(不匹配的空约束)

时间:2016-11-21 18:55:57

标签: java eclipse null nullable non-nullable

我有一个派生自shutdownNow()的课程。我的班级会覆盖org.eclipse.jdt.annotation.@NonNullByDefault。一切都编译好了。

我在课堂上添加了shutdownNow()。我设法修复了除@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()); } } 上的1个错误之外的所有错误和警告。错误消息说......

  

返回类型与&#39;列表&#39;不兼容。从ExecutorService.shutdownNow()返回   (不匹配的空约束)

快速解决方案没有任何帮助。

这是有问题的代码。

There has been an error processing your request
Invalid config field backend model: dpd/adminhtml_system_config_backend_shipping_dpdclassic_tablerate

Trace:
#0 /html/magento/app/code/core/Mage/Adminhtml/Block/System/Config/Form.php(328): Mage::throwException('Invalid config ...')
#1 /html/magento/app/code/core/Mage/Adminhtml/Block/System/Config/Form.php(229): Mage_Adminhtml_Block_System_Config_Form->initFields(Object(Varien_Data_Form_Element_Fieldset), Object(Mage_Core_Model_Config_Element), Object(Mage_Core_Model_Config_Element))
#2 /html/magento/app/code/core/Mage/Adminhtml/Block/System/Config/Form.php(164): Mage_Adminhtml_Block_System_Config_Form->_initGroup(Object(Varien_Data_Form), Object(Mage_Core_Model_Config_Element), Object(Mage_Core_Model_Config_Element))
#3 /html/magento/app/code/core/Mage/Adminhtml/Block/System/Config/Edit.php(92): Mage_Adminhtml_Block_System_Config_Form->initForm()
#4 /html/magento/app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php(107): Mage_Adminhtml_Block_System_Config_Edit->initForm()
#5 /html/magento/app/code/core/Mage/Core/Controller/Varien/Action.php(419): Mage_Adminhtml_System_ConfigController->editAction()
#6 /html/magento/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('edit')
#7 /html/magento/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#8 /html/magento/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#9 /html/magento/app/Mage.php(683): Mage_Core_Model_App->run(Array)
#10 /html/magento/index.php(90): Mage::run('', 'store')
#11 {main}

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

这是代码的图像。

enter image description here

1 个答案:

答案 0 :(得分:1)

似乎ExecutorService不在任何@NonNullByDefault的范围内,对吗?

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

然而,覆盖受@NonNullByDefault影响,使其有效签名@NonNull List<@NonNull Runnable> shutdownNow()

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

我们不知道ExecutorService.shutdownNow()的预期语义:客户端是否期望返回列表中的可空或非空元素?假设List<@NonNull Runnable>会打破shutdownNow()的潜在呼叫者,他们希望将null插入到结果列表中(忽略这意味着奇怪的设计)。

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

如果因任何原因注释超接口是不可行的,即继续使用“遗留”类型List<Runnable>,则可以通过说@NonNullByDefault({})来取消这一方法的null默认值,并在需要的地方手动添加@NonNull