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