2013-02-27 2 views
0

Может ли кто-нибудь объяснить, почему первый актерский состав не дает CCE?Java Исключения. Передать один тип другому

public class Test { 

    public static void main(String[] args) throws Throwable { 
    Test.<RuntimeException>throwIt(new Exception()); 
    } 

    @SuppressWarnings("unchecked") 
    private static <T extends Throwable> void throwIt(Throwable throwable) throws T { 
    throw (T) throwable; // no ClassCastException 
    throw (RuntimeException) throwable; // ClassCastException(as it should be) 
    } 
} 

P.S. Прокомментируйте один листинг (иначе он не будет компилироваться).

+1

Второй 'throw' недостижим – Reimeus

+0

Что такое ваш вопрос? Скомпилирован ли ваш код? Вы получите недостижимую ошибку компиляции кода. – Jayamohan

+0

oh, common, comment one then other – Bax

ответ

1

Это особенность реализации Java-генериков, она была реализована посредством стирания стилей, поэтому (T) на самом деле отбрасывает ее в Throwable как левую границу. Поскольку, новый Exception() создает Throwable объект, вы можете безопасно его выбросить.

Вы можете проверить это в JSL http://docs.oracle.com/javase/specs/jls/se5.0/html/typesValues.html#108979

Смежные вопросы