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