【问题标题】:method implementation for this case in JavaJava中这种情况的方法实现
【发布时间】:2010-03-19 17:24:02
【问题描述】:

我刚刚看到一个这样的代码sn-p:

private static class DefaultErrorHandler<RT> implements ErrorHandler<RT> {
  public RT handle(Object[] params, Throwable e) {
   return Exceptions.throwUncheckedException(e);
  }
}

现在我想知道 throwUncheckedException (Throwable e) 的静态方法会准确返回什么,以及如何针对泛型实现它。

谁能给我一个例子?

【问题讨论】:

  • 所以你想返回一个值抛出一个未经检查的异常?
  • 是的。在执行过程中总是会抛出异常,而返回值是为了关闭编译器。

标签: java generics methods


【解决方案1】:

你可以这样定义方法:

public static <T> T throwUncheckedException (Throwable e) { ... }

本质上意味着“对于任何类型 T,返回它”。然后你依靠the compiler's ability to guess T = RT。

我认为从throwUncheckedException 方法返回值的想法如下:你想调用一个总是抛出运行时异常的方法,而你从一个非void 方法调用它。 Java 编译器抱怨调用者在每个执行分支的末尾都需要一个 return 语句。这个技巧为您节省了“虚拟回报”的需要。

【讨论】:

    【解决方案2】:

    我不得不猜测它由以下组成:

    throw new RuntimeException(e);

    但实际上,我猜返回值只是为了展示。该方法称为“抛出”。

    如果它返回一些东西,它会返回一些'RT'类型的东西,不管它是什么。

    【讨论】:

      【解决方案3】:

      让 throwUncheckedException() 方法返回某些内容可以避免调用方法中需要返回值的额外行。

      是否直接从handle方法抛出异常如下:

      public RT handle(Object[] params, Throwable e) {
          throw new RuntimeException(e);
      }
      

      不需要 return 语句(实际上它甚至是非法的),因为编译器将能够知道 throw 之后的任何语句都是不可访问的。

      但是由于 throw 是在另一个方法中完成的,并且由于 handle 方法需要返回值,所以必须添加 return statememt。

      让 throwUncheckedException() 返回一些东西允许调用在 return 语句中。

      throwUncheckedException() 必须接近于:

      public static <T> T throwUncheckedException(Throwable e) {
          throw new RuntimeException(e);
          return null;
      }
      

      恕我直言,这引发了您的问题,这表明它太令人费解了,不值得。也许实现相同目标的更好方法是这样的:

      public RT handle(Object[] params, Throwable e) {
          throw Exceptions.makeUncheckedException(e);
      }
      

      【讨论】: