Java 8中异常类型推断的一个特殊特性

17 浏览
0 Comments

Java 8中异常类型推断的一个特殊特性

在为这个网站上的另一个答案编写代码时,我遇到了这个奇特的情况:

static void testSneaky() {
  final Exception e = new Exception();
  sneakyThrow(e);    //这里没有问题
  nonSneakyThrow(e); //错误:未处理的异常:java.lang.Exception
}
@SuppressWarnings("unchecked")
static  void sneakyThrow(Throwable t) throws T {
  throw (T) t;
}
static  void nonSneakyThrow(T t) throws T {
  throw t;
}

首先,我对编译器为什么认为sneakyThrow调用是正确的感到非常困惑。在任何地方都没有提到未检查异常类型,它可能为T推断出什么类型?

其次,如果接受这一点是有效的,为什么编译器在nonSneakyThrow调用时会抱怨?它们看起来非常相似。

0