abstract class A<X> implements I2<Class<? extends X>, X> {
<B, T extends B> T cast(Class<T> type, B value) {
return null;
}
<T extends X> T foo(Class<T> type, T value) {
return cast(type, put(type, value));
}
<T extends X> T bar(Class<T> type) {
return cast(type, get(type));
}
I1 myI = new I1() {
@Override
public void foo(Class<?> key, Object value) {
cast(key, value);
}
};
}
interface I1 {
void foo(Class<?> key, Object value);
}
interface I2<K, V> {
V put(K key, V value);
V get(Object key);
}
class B {
void print(String s) { }
<T> void myMethod(T param) {
print(param.toString());
}
<T extends C> void myMethod1(T param) {
print(param.bar());
}
<T extends I3> void myMethod2(T param) {
print(param.foo());
}
<T extends C & I3> void myMethod3(T param) {
print(param.bar() + param.foo() + param.toString());
}
}
class C {
String bar() { return ""; }
}
interface I3 {
String foo();
}