Каков тип перехваченного исключения в многоадресном блоке Java 7?

В многоадресном блоке Java 7, например:

try {
    // code that throws exception
} catch (CharacterCodingException | UnknownServiceException ex) {
    // handle exception
}

что такое тип времени компиляции ex? Это самый производный класс, который объединяет оба типа исключений? В этом примере это было бы IOException,

2 ответа

Решение

Да, тип ex является наиболее конкретным супертипом обоих CharacterCodingException а также UnknownServiceException, который был бы IOException,

Изменить: прямо изо рта лошади на http://cr.openjdk.java.net/~darcy/ProjectCoin/ProjectCoin-Documentation-v0.83.html:

Неформально lub (наименьшая верхняя граница) является наиболее специфическим супертипом рассматриваемых типов.

В JSL 7 http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html

§14.20 > Объявленный тип параметра исключения, который обозначает его тип как объединение с альтернативами D1 | D2 | ... | Dn является lub(D1, D2, ..., Dn) (§15.12.2.7).

Определение lub() т.е. наименьшая верхняя граница довольно запутанная. К счастью, типы, о которых мы здесь говорим, обычно являются просто неуниверсальными подклассами Throwable, и lub() дает самый специфический суперкласс.

Для более сложного случая рассмотрим

class E1 extends Exception implements G<A>
class E2 extends Error implements G<B>

lub(E1, E2) = Throwable & G<?>
Другие вопросы по тегам