| public class Unions { |
| void foo1(MyInterface<Throwable> param) throws Throwable { |
| try { |
| bar(); |
| } catch (MyExceptionA | MyExceptionB ex) { |
| typeVar(ex); |
| typeVarIntersection(ex); |
| |
| typeVarWildcard(ex, param); |
| typeVarWildcard2(ex, param); |
| } |
| } |
| |
| void foo2(MyInterface<Throwable> param) throws Throwable { |
| try { |
| bar(); |
| } catch (SubMyExceptionA | SubMyExceptionA2 ex) { |
| typeVar(ex); |
| typeVar2(ex, ex); |
| |
| typeVarIntersection(ex); |
| |
| typeVarWildcard(ex, param); |
| typeVarWildcard2(ex, param); |
| } |
| } |
| |
| <T extends Cloneable & MyInterface<String>> void typeVarIntersection(T param) {} |
| |
| <T extends Throwable> void typeVar(T param) {} |
| |
| <T extends Throwable> void typeVar2(T param, T param2) {} |
| |
| <T extends Throwable> void typeVarWildcard(T param, MyInterface<? extends T> myInterface) {} |
| |
| <T extends Throwable> void typeVarWildcard2(T param, MyInterface<? super T> myInterface) {} |
| |
| void bar() throws MyExceptionA, MyExceptionB {} |
| |
| interface MyInterface<T> {} |
| |
| class MyExceptionA extends Throwable implements Cloneable, MyInterface<String> {} |
| |
| class MyExceptionB extends Throwable implements Cloneable, MyInterface<String> {} |
| |
| class SubMyExceptionA extends MyExceptionA {} |
| |
| class SubMyExceptionA2 extends MyExceptionA {} |
| } |