Типовое стирание типа и тип приведения - PullRequest
0 голосов
/ 24 марта 2020

Я хочу пройтись по причинам исключения, пока не найду «правильную», но похоже, что тип стирается, и функция возвращает переданное исключение, которое приводит к ClassCastException в main. Вот мой код:

public class Main {

public static void main(String[] args) {
    Throwable e0 = new CertPathValidatorException("0");
    Throwable e1 = new CertificateException(e0);
    Throwable e2 = new CertificateException(e1);
    Throwable e3 = new CertificateException(e2);

    CertPathValidatorException cpve = Main.<CertPathValidatorException>getCauseOf(e3);
}

@Nullable
private static <Ex extends Exception> Ex getCauseOf(final Throwable e) {
    Throwable cause = e;
    while (true) {
        try {
            return (Ex) cause;
        }
        catch (ClassCastException cce) {
            cause = cause.getCause();
        }
    }
}

}

Есть ли способ сохранить эту функцию обобщенной c, или я должен отказаться от этой идеи?

1 Ответ

1 голос
/ 24 марта 2020

Использование дженериков здесь опасно. Java разрешает обобщенные c типы во время компиляции. В вашем коде вам потребуется разрешение во время выполнения. Вы можете сделать это, передав класс в качестве параметра вашей функции.

private static <Ex extends Exception> Ex getCauseOf(final Class<Ex> typeResolve, final Throwable e) {
    Throwable cause = e;
    while (cause != null) {
        if (typeResolve.isInstance(cause)) return (Ex) cause; // or typeResolve.cast(cause);
        else cause = cause.getCause();
    }
    return null;
}

Таким образом, вы можете изменить вызов следующим образом:

CertPathValidatorException cpve = Main.getCauseOf(CertPathValidatorException.class, e3);
...