【问题标题】:How to define an interface throwing a generic exception type?如何定义一个抛出通用异常类型的接口?
【发布时间】:2012-04-04 11:17:21
【问题描述】:

我想定义一个接口,比如

public interface Visitor <ArgType, ResultType, SelfDefinedException> {
     public ResultType visitProgram(Program prog, ArgType arg) throws SelfDefinedException;
     //...
}

在实现过程中,selfDefinedException 会有所不同。 (selfDefinedException 现在是一个通用的 undefined) 有没有办法做到这一点?

谢谢

【问题讨论】:

  • 您可以将您的接口定义为抛出一个异常,该异常是所有 selfDefinedExceptions 的超类。

标签: java generics exception interface throws


【解决方案1】:

你可以这样做

public interface Test<T extends Throwable> {
    void test() throws T;
}

然后,例如

public class TestClass implements Test<RuntimeException> {
    @Override
    public void test() throws RuntimeException {
    }
}

当然,当你实例化类时,你必须声明抛出的异常。

编辑:当然,将 Throwable 替换为您定义的任何异常,这些异常将扩展 ThrowableException 或类似的。

【讨论】:

    【解决方案2】:

    您只需要将异常类型限制为适合抛出。例如:

    interface Visitor<ArgType, ResultType, ExceptionType extends Throwable> {
        ResultType visitProgram(String prog, ArgType arg) throws ExceptionType;
    }
    

    或许:

    interface Visitor<ArgType, ResultType, ExceptionType extends Exception> {
        ResultType visitProgram(String prog, ArgType arg) throws ExceptionType;
    }
    

    【讨论】:

    • 但是您想使用传统的命名约定,对吧?
    • @TomHawtin-tackline: 是的,尽管 Java 中命名类型参数的约定不像 .NET 中那样清晰...
    • @JonSkeet 我认为很清楚:单个大写字母 (docs.oracle.com/javase/tutorial/java/generics/types.html) 但这并不令人满意,所以我们不想关注他们:-)
    【解决方案3】:

    您的泛化参数需要扩展 Throwable。像这样的:

    public class Weird<K, V, E extends Throwable> {
    
       public void someMethod(K k, V v) throws E {
          return;
       }
    }
    

    【讨论】:

    • E 不能是一组异常类型,这是一种耻辱。
    • 确实,这应该是一个可变参数类型参数,似乎仍然不被支持。
    【解决方案4】:

    如果我理解了这个问题,你可以抛出

    Exception
    

    因为它是父类。

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 2013-03-14
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      相关资源
      最近更新 更多