1*f0340d8eSSorin Bascaclass GenericMethodArguments {
2*f0340d8eSSorin Basca
3*f0340d8eSSorin Basca    static class Items<T> {
4*f0340d8eSSorin Basca        public <Output extends T> Output apply(Transform<? super Items<T>, Output> t) {
5*f0340d8eSSorin Basca            return null;
6*f0340d8eSSorin Basca        }
7*f0340d8eSSorin Basca    }
8*f0340d8eSSorin Basca
9*f0340d8eSSorin Basca    static class Transforms {
10*f0340d8eSSorin Basca        public static <I, O> Transform<I, O> of(DoFn<I, O> fn) {
11*f0340d8eSSorin Basca            return null;
12*f0340d8eSSorin Basca        }
13*f0340d8eSSorin Basca    }
14*f0340d8eSSorin Basca
15*f0340d8eSSorin Basca    static class Transform<Input, Output> {}
16*f0340d8eSSorin Basca
17*f0340d8eSSorin Basca    static class DoFn<Input, Output> {}
18*f0340d8eSSorin Basca
19*f0340d8eSSorin Basca    static class MyFn1<T> extends DoFn<T, Long> {}
20*f0340d8eSSorin Basca
21*f0340d8eSSorin Basca    static class MyFn2 extends MyFn1<Integer> {}
22*f0340d8eSSorin Basca
23*f0340d8eSSorin Basca    private Items<Integer> items;
24*f0340d8eSSorin Basca
25*f0340d8eSSorin Basca    public void useCase1() {
26*f0340d8eSSorin Basca        items.apply(Transforms.of(new MyFn2()));
27*f0340d8eSSorin Basca    }
28*f0340d8eSSorin Basca
29*f0340d8eSSorin Basca    public void useCase2() {
30*f0340d8eSSorin Basca        items.apply(Transforms.of(new DoFn<Integer,Long>(){}));
31*f0340d8eSSorin Basca    }
32*f0340d8eSSorin Basca
33*f0340d8eSSorin Basca}
34