Чтобы объявить, что метод выбрасывает исключение обобщенного типа
T, этот тип T должен быть объявлен расширяющим Throwable. Именно в Throwable в таком случае сотрется T при компиляции. Также в качестве типа-верхней границы можно использовать любого наследника Throwable:class MyClass<T extends IOException> {
void foo() throws T {
// ...
}
}