| import java.lang.Override; |
| import java.util.*; |
| class GenericsTest<T> { |
| |
| static <S> S next(GenericsTest<S> test) |
| { |
| System.out.println(test); |
| return null; |
| } |
| |
| public Iterator<T> iterator() |
| { |
| return new Iterator<T>() { |
| @Override |
| public boolean hasNext() |
| { |
| return false; |
| } |
| |
| @Override |
| public T next() |
| { |
| return GenericsTest.next(GenericsTest.this); |
| } |
| |
| @Override |
| public void remove() |
| { |
| } |
| }; |
| } |
| } |
| |
| class GenericsTest1<T> { |
| |
| static <S> S next1(GenericsTest1<S> test) |
| { |
| System.out.println(test); |
| return null; |
| } |
| |
| public Iterator<T> iterator() |
| { |
| return new Iterator<T>() { |
| @Override |
| public boolean hasNext() |
| { |
| return false; |
| } |
| |
| @Override |
| public T next() |
| { |
| return GenericsTest1.next1(GenericsTest1.this); |
| } |
| |
| @Override |
| public void remove() |
| { |
| } |
| }; |
| } |
| } |
| |
| |
| class GenericsTest2<T> { |
| |
| static <S> S next2(GenericsTest2<S> test) |
| { |
| System.out.println(test); |
| return null; |
| } |
| |
| public Iterator<T> iterator() |
| { |
| return new Iterator<T>() { |
| @Override |
| public boolean hasNext() |
| { |
| return false; |
| } |
| |
| @Override |
| public T next() |
| { |
| return next2(GenericsTest2.this); |
| } |
| |
| @Override |
| public void remove() |
| { |
| } |
| }; |
| } |
| } |
| class Example { |
| private static <T> void assertThat(T actual, Matcher<? super T> matcher) { |
| assert actual != null; |
| assert matcher != null; |
| } |
| |
| private static <E> Matcher<? super Collection<? extends E>> hasSize(int size) { |
| assert size >=0; |
| return new Matcher<Collection<? extends E>>() { |
| @Override |
| public void foo(Collection<? extends E> es) { |
| System.out.println(es); |
| } |
| }; |
| } |
| |
| public static void main(String[] args) { |
| List<Boolean> list = <warning descr="Unchecked assignment: 'java.util.ArrayList' to 'java.util.List<java.lang.Boolean>'">new ArrayList()</warning>; |
| System.out.println(list); |
| assertThat(new ArrayList<Boolean>(), hasSize(0)); |
| } |
| |
| private interface Matcher<T> { |
| void foo(T t); |
| } |
| } |
| |
| abstract class IDEA57337<<warning descr="Type parameter 'S' is never used">S</warning>> { |
| abstract <T> void foo(IDEA57337<? super IDEA57337<T>> x); |
| void bar(IDEA57337<? super IDEA57337<?>> x){ |
| foo(x); |
| } |
| } |