package test;


import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class TypeParameterBoundExample {
    // extends Runnable produces T::List signature, so
    // @Nullable targets index=1 (optional class bound always counts)
    public static class ListConsumer<T extends @Nullable List<?>>
            implements Consumer<T> {
        @Override
        public void accept(T t) {
        }
    }

    // extends Runnable produces T:ArrayList signature since ArrayList is class
    public static class ArrayListConsumer<T extends @Nullable ArrayList<?>>
            implements Consumer<T> {
        @Override
        public void accept(T t) {
        }
    }

    // extends Runnable produces T:ArrayList signature since ArrayList is class
    public static class SerializableListConsumer<T extends @Nullable List<?> & @Untainted Serializable>
            implements Consumer<T> {
        @Override
        public void accept(T t) {
        }
    }

    // extends Runnable produces T:ArrayList signature since ArrayList is class
    public static class SerializableListConsumerDoubleA<T extends @Nullable @Untainted List<?> & @Untainted Serializable>
            implements Consumer<T> {
        @Override
        public void accept(T t) {
        }
    }
}

@@ -124,16 +124,52 @@
 onsumer;
+%0Aimport java.util.function.Supplier;
 %0A%0Apublic
@@ -1358,11 +1358,371 @@
  %7D%0A    %7D
+%0A%0A    public static class IteratorSupplier implements Supplier%3CConsumer%3C@Nullable Object%5B%5D%3E%3E %7B%0A        @Override%0A        public Consumer%3C@Nullable Object%5B%5D%3E get() %7B%0A            return new Consumer%3C@Nullable Object%5B%5D%3E() %7B%0A                @Override%0A                public void accept(@Nullable Object%5B%5D objects) %7B%0A                %7D%0A            %7D;%0A        %7D%0A    %7D
 %0A%7D%0A

Add cless extends type param example