【问题标题】:Is there an effective way to use generics in a throws clause?有没有在 throws 子句中使用泛型的有效方法?
【发布时间】:2014-07-12 08:08:58
【问题描述】:

根据 Cannot Create, Catch, or Throw Objects of Parameterized Types (Java Tutorials):

但是,您可以在 throws 子句中使用类型参数:

class Parser<T extends Exception> {
    public void parse(File file) throws T {     // OK
        // ...
    }
}

但你为什么要这样做?你不能在这里构造T。如果在外部构建之后注入T,它的堆栈跟踪不会全错吗?他们是否只是在记录一个碰巧起作用的功能,而不管它是否有用?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    为什么不

    class FooParser extends Parser<FooException> {
        public void parse(File file) throws FooException {
            throw new FooException("Not Supported");
        }
    }
    

    【讨论】:

      【解决方案2】:

      你可以有

      public class ExceptionWithPayload<T> extends Exception {
          private final T payload;
          public ExceptionWithPayload(T payload) {
              this.payload = payload;
          }
          public T getPayload(){
              return payload;
          }
      }
      

      然后在其他类中,你可以写

      throw new ExceptionWithPayload<MyClass>(myObject);
      

      以便能够将您喜欢的任何对象传递回捕获异常的对象,但在 catch 子句中进行类型检查。

      【讨论】:

      • 这不起作用,它显示编译时错误Generic class may not extend Throwable
      • 如果您创建了自己的名为Exception 的类,则可能会发生这种情况。不要那样做。
      • 不,我试图扩展 RuntimeException。
      • 我建议您提出一个新问题并发布您的代码。如果你愿意,可以链接到这个。
      • 我不认为在这里发布一个单独的问题会有所帮助。如果您可以查看并更正答案,那就太好了。
      【解决方案3】:

      您可以使用鬼鬼祟祟的抛出技巧将检查的异常抛出预期之外的地方:http://rdafbn.blogspot.hu/2013/07/lomboks-sneaky-throws.html

      或者没有魔法:http://www.mail-archive.com/javaposse@googlegroups.com/msg05984.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 2022-06-21
        • 2018-04-03
        • 1970-01-01
        相关资源
        最近更新 更多