class Test { interface A {} interface B {} //? extends A, ? extends B ----------------------------------------- void testEE1() { class A {} class B {} W xx = null; W y = (W) xx; } void testEE2() { class A {} class B extends A {} W xx = null; W y = (W) xx; } void testEE21() { class A {} class B extends A {} W xx = null; W y = (W) xx; } void testEE211() { class A {} final class B extends A {} W xx = null; W y = (W) xx; } void test3EE() { W xx = null; W y = (W) xx; } void test4EE() { class A {} W xx = null; W y = (W) xx; } void test41EE() { class A {} W xx = null; W y = (W) xx; } void test411EE() { final class A {} W xx = null; W y = (W) xx; } void test412EE() { final class A implements B {} W xx = null; W y = (W) xx; } void test1() { class A {} class B {} W xx = null; W y = (W) xx; } void test2() { final class A {} final class B {} W xx = null; W y = (W) xx; } //? super A, ? super B ------------------------- void test3SS() { W xx = null; W y = (W) xx; } //? extends A, ? super B ------------------------- void test1ES() { class A {} class B {} W x = null; W y = (W) x; } void test2ES() { class A {} class B extends A {} W x = null; W y = (W) x; } void test3ES() { class A {} class B extends A {} W x = null; W y = (W) x; } void test4ES() { W x = null; W y = (W) x; } void test5ES() { final class B implements A {} W x = null; W y = (W) x; } void test6ES() { final class B implements A {} W x = null; W y = (W) x; } // ? extends A, B ----------------------- void test1EWC() { class A { } class B { } W xx = null; W y = (W) xx; } void test2EWC() { class A { } W xx = null; W y = (W) xx; } void test3EWC() { class A { } class B extends A { } W xx = null; W y = (W) xx; } // ? super A, B ----------------------- void test1SWC() { class A { } class B { } W xx = null; W y = (W) xx; } void test2SWC() { class A { } W xx = null; W y = (W) xx; } void test3SWC() { class A { } class B extends A { } W xx = null; W y = (W) xx; } // ?, ? ------------------------------------------ void test1WWW() { W xx = null; W y = xx; } //? extends P, B -------------------- void test1EEWC() { class A { } class B { } W> xx = null; W y = (W) xx; } void test2EEWC() { class A { } class B extends P { } W> xx = null; W y = (W) xx; } void test3EEWC() { class A { } class B extends P { } W> xx = null; W> y = (W>) xx; } void test4EEWC() { class A { } class B extends P { } W> xx = null; W> y = (W>) xx; } void test5EEWC() { class A { } class B extends P { } class C {} W> xx = null; W> y = (W>) xx; } //Array Types inside wildcards void test1AE() { class A {} class B {} W xx = null; W y = (W) xx; } void test11AE() { class A {} class B {} W xx = null; W y = (W) xx; } void test2AE() { class A {} class B extends A {} W xx = null; W y = (W) xx; } void test21AE() { class A {} class B extends A {} W xx = null; W y = (W) xx; } void testIntAE() { W xx = null; W y = (W) xx; } void testInt1AE() { W xx = null; W y = (W) xx; } void testASS() { class A {} class B {} W xx = null; W y = (W) xx; } void test1AES() { class A {} class B {} W x = null; W y = (W) x; } void test2AES() { class A {} class B extends A {} W x = null; W y = (W) x; } void test3AES() { class A {} class B extends A {} W x = null; W y = (W) x; } void test4AES() { W x = null; W y = (W) x; } void test5AES() { final class B implements A {} W x = null; W y = (W) x; } void test6AES() { final class B implements A {} W x = null; W y = (W) x; } // type parameters extensions: D void testT3() { class A { } class D { class B extends A { } void foo() { D x = null; D y = (D) x; } } } void testT4() { class A { } class D { class B { } void foo() { D x = null; D<? extends B> y = (D<? extends B>) x; } } } void testT5() { class D { class B { } void foo() { D x = null; D y = (D) x; } } } void testT6() { class A { } class D { class B extends A { } void foo() { D x = null; D y = (D) x; } } } void testT7() { class A { } class D { class B extends A { } void foo() { D x = null; D y = (D) x; } } } void testT8() { class A { } class D { class B extends A { } void foo() { D x = null; D y = (D) x; } } } void testT9() { class A { } class D { class B extends A { } void foo() { D x = null; D y = (D) x; } } } void testUnbounded() { W x = null; W y = ( W) x; W y1 = (W)x; } void testTypeParams() { class MyClass { MyClass convert(MyClass arg) { MyClass result = (MyClass)arg; return result; } } } //IDEA-63447 void testUnboundWildcardWithArrayTypes() { class IUWWAT{ private void method1(T[][] matrix) { final Class type = (Class) matrix.getClass().getComponentType(); } private void method2(T[][] matrix) { final Class type = (Class) matrix.getClass().getComponentType(); } private void method3(T[][] matrix) { final Class type = (Class) matrix.getClass().getComponentType(); } private void method4(T[][] matrix) { final Class type = (Class) matrix.getClass().getComponentType(); } } } } class W {} class P {} // IDEA-62529 class Refx { Class get() { return null; } boolean f() { if (get() == Enum.class) return false; return (Class)get() == Enum.class; } } //hierarchy of type param bound abstract class DomInvocationHandler { void f() { if (this instanceof IndexedElementInvocationHandler) { } } } interface AbstractDomChildrenDescription { } class AbstractDomChildDescriptionImpl implements AbstractDomChildrenDescription { } class IndexedElementInvocationHandler extends DomInvocationHandler { } class FixedChildDescriptionImpl extends AbstractDomChildDescriptionImpl { } class CaptureSymmetry { interface Collection {} interface List extends Collection{} class ArrayList implements List {} public static Collection unmodifiableCollection(Collection c) { return null; } public > Collection getBreakpoints (List b) { Collection> breakpoints = null; Collection regular = breakpoints != null ? unmodifiableCollection((Collection)breakpoints) : b; return null; } }