Как исправить эту функцию, которая только сейчас выдает исключение, но я также хочу вернуть объект? - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь переопределить метод Preconditions.checkNotNull, который в настоящее время не может принимать определенные пользователем исключения.Я пишу свой собственный метод, чтобы он также начал принимать метод исключения.

Ожидаемый метод:

  1. Проверка, является ли переданный объект нулевым.
  2. Если переданный объект является нулевым, выдается исключение типа, переданного какпараметр.
  3. Если переданный объект не равен нулю, вернуть сам объект.

Я написал следующие функции:

public static < T extends Exception > T checkNotNull(T reference, Class < T > exClass, String errorMessage, Object...args) throws T {
    if (reference == null) {
        generateException(exClass, errorMessage, args);
    }
    return reference;
}

private static < T extends Exception > void generateException(Class < T > exClass, String errorMessage, Object...args) throws T {
    try {
        if (errorMessage == null) {
            throw exClass.newInstance();
        } else {
            throw exClass.getDeclaredConstructor(String.class, Object[].class).newInstance(errorMessage, args);
        }
    } catch (InstantiationException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
        e.printStackTrace();
    }
}

Они определены в файленазывается ExceptionHandler.java.

Но, когда я пытаюсь вызвать его таким образом, происходит сбой:

ExceptionHandler.checkNotNull(myInputObject, InvalidInputException.class, "The input cannot be null");

Отображается следующая ошибка:

причина: нет экземплярасуществуют переменные типа (типов), поэтому список соответствует исключению

1 Ответ

2 голосов
/ 17 мая 2019
public static <T extends Exception> T checkNotNull(T reference, Class<T> exClass, String errorMessage, Object... args) throws T {

Это не позволит вам передать произвольный класс для второго параметра. Это должен быть класс типа объекта, который вы передаете в первом параметре. Но поскольку вы указали ограничение типа для T в качестве исключения, оно (myInputObject) также не помещается в первый параметр.

Изменить объявление функции как

public static <T, X extends Exception> T checkNotNull(T reference, Class<X> exClass, String errorMessage, Object... args) 
        throws X 

Здесь объявляется новый параметр типа X для класса исключения, который должен быть передан.

...