我有一个派生自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()不是问题所在。它只是简化了重现相同错误消息的实际代码。
这是代码的图像。
答案 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
。