Как определить интерфейс с бросками универсального типа исключения


Я хочу определить интерфейс, например

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

Во время реализации selfDefinedException изменяется. (selfDefinedException как универсальный неопределенный на данный момент) Есть ли способ сделать это?

Спасибо

4 2

4 ответа:

Вам просто нужно ограничить тип исключения, чтобы он был подходящим для выброса. Например:

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;
}

Ваш обобщенный параметр должен быть расширен Throwable. Что-то вроде этого:

public class Weird<K, V, E extends Throwable> {

   public void someMethod(K k, V v) throws E {
      return;
   }
}

Вы можете сделать что-то вроде

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

А затем, например

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

Конечно, когда вы создаете экземпляр класса, вы должны объявить исключение, которое создается.

Редактировать: конечно, заменить Throwable с себя определенными исключениями, которые позволят продлить Throwable, Exception или похожие.

Если я правильно понял вопрос, вы можете бросить

Exception

Как это родительский класс.