class GenericMethodArguments {
static class Items<T> {
public <Output extends T> Output apply(Transform<? super Items<T>, Output> t) {
return null;
}
}
static class Transforms {
public static <I, O> Transform<I, O> of(DoFn<I, O> fn) {
return null;
}
}
static class Transform<Input, Output> {}
static class DoFn<Input, Output> {}
static class MyFn1<T> extends DoFn<T, Long> {}
static class MyFn2 extends MyFn1<Integer> {}
private Items<Integer> items;
public void useCase1() {
items.apply(Transforms.of(new MyFn2()));
}
public void useCase2() {
items.apply(Transforms.of(new DoFn<Integer,Long>(){}));
}
}