package org.foo;
class ParametrizedMethodsWithTypeInference {
<T> B<T> f1(T t) {
return null;
}
<T> T f2(B<T> b) {
return null;
}
<T> T f3(int i, B<T> b) {
return null;
}
<T> T[] f4(T[] a) {
return null;
}
<K, V> C<K, V> f5(K k, V v) {
return null;
}
<T> B<? super T> f6(B<? extends T> c) {
return null;
}
<T> T f7(B<B<T>> b) {
return null;
}
Object f8(Object o) {
return null;
}
<T extends B> T f8(T t) {
return null;
}
Object f9(Object o) {
return null;
}
<T extends B & I> T f9(T t) {
return null;
}
<T> T f10(T... a) {
return null;
}
<U, V> C<V, U> f11(V v, B<U> b) {
return null;
}
<T> T f12(B<? extends Number> b1, B<? extends T> b2) {
return null;
}
<T> T f13(T[][][][] a) {
return null;
}
<T> B<T> f14(T... a) {
return null;
}
<T, U> T f15(U u, T... t) {
return null;
}
<T> B<T> f16(B<? extends T> ... b) {
return null;
}
<X, T, V extends T> Object f17(C<X, T> c, B<V> b) {
return f17(c, b);
}
void test_resolution(B<?> bwc, B<A> ba, B<? extends A> bwcEa) {
f1("String");
f1(null);
f2(new B<Integer>());
f2(new B());
f2(null);
f3(0, new B<Integer>());
f4(new String[0]);
f5("foo", Integer.valueOf(42));
f5("foo", 42);
f6(ba);
f6(bwc);
f6(bwcEa);
f7(new B<B<Integer>>());
f8(new A());
f8(new B<String>());
f9(new A());
f9(new B());
f9(new D());
f10(42);
f10(1.0, 42);
f10(new E(), new F(), new G());
f11("hello", ba);
f12(new B<Integer>(), ba);
f13(new Integer[0][0][0][0]);
f14("hello", "world");
f15(new A());
f16(new B());
f16(new B(), new B());
f16(new B(), new B<Integer>());
f16(new B<String>(), new B<Integer>());
f16(new B<String>(), new D());
}
// reference types
Object object;
B<String> bString;
B<Object> bObject;
Integer integer;
Number number;
String[] stringArray;
C<String, Integer> cStringInteger;
C<String, A> cStringA;
B<? super A> wcSuperA;
B<? super Object> wcSuperObject;
D dType;
A aType;
B<Comparable<? extends Comparable>> comparable;
interface I {
}
class A {
}
class B<X> {
}
class C<X, Y> {
}
class D extends B<String> implements I {
}
class E extends A {}
class F extends E {}
class G extends A {}
}