此代码编译时没有错误:
private FutureTask<MessageSource> loadingTask(final Locale locale)
{
return new FutureTask<MessageSource>(new Callable<MessageSource>()
{
@Override
public MessageSource call()
throws IOException
{
return loader.load(locale);
}
});
}
但是Callable
接口(interface)定义如下:
public V call()
throws Exception;
我为什么可以声明我的重写抛出 IOException
?
注意:我已经通过 Guava 的 CacheLoader
看到并利用了这一点。例如。
最佳答案
简短的回答:您可以这样做,因为 IOException
是一个 Exception
。
public V call() throws Exception
意味着“这个方法可以抛出一个异常
并且没有其他检查异常!”。
如果您现在像这样重写此方法:
public MessageSource call() throws IOException
您实际上是在说“我们可以抛出任何 Exception
,但我们自愿将自己限制为一个子集:IOException
及其子项”。
你甚至可以这样做:
public Something call()
根本没有抛出
:“我们可以抛出任何异常
,但我保证我们根本不会抛出任何已检查的异常!”
关于java - 可调用 : why can we "change" the exception on implementation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16958180/