I'm having trouble understanding why I can use bounded wildcards like this, if I can't (seem to) make any (genericly-typed) use of it.
If I have a wildcard field in a class, I can't use any of the methods with generic parameters of the implemented interface (unless I supply null as the argument).
class SomeClass {} class DerivedClass extends SomeClass {} interface IInterf<T extends SomeClass> { T returnsT(); void paramT(T parm); T paramAndReturnT(T parm); int nonGenericMethod(int x); } class Impl { protected IInterf<?> field; //this is bound to <extends SomeClass> //- it's implied by the definition // of IInterf which is bound // but what's the point? public Impl(IInterf<? extends SomeClass> var){ field = var; } public void doSmth(){ SomeClass sc = field.returnsT(); //works field.paramT(new SomeClass()); //error: method paramT in interface IInterf<T> cannot be applied to given types; //required: CAP#1 //found: SomeClass //reason: actual argument SomeClass cannot be converted to CAP#1 by method invocation conversion //where T is a type-variable: // T extends SomeClass declared in interface IInterf //where CAP#1 is a fresh type-variable: // CAP#1 extends SomeClass from capture of ? field.paramT(null); //works SomeClass sc2 = field.paramAndReturnT(new DerivedClass()); //error: method paramAndReturnT in interface IInterf<T> cannot be applied to given types; // SomeClass sc2 = field.paramAndReturnT(new DerivedClass()); //required: CAP#1 //found: DerivedClass //reason: actual argument DerivedClass cannot be converted to CAP#1 by method invocation conversion //where T is a type-variable: // T extends SomeClass declared in interface IInterf //where CAP#1 is a fresh type-variable: // CAP#1 extends SomeClass from capture of ? // int x = field.nonGenericMethod(5); //obviously works. } } FWIW, I couldn't convince the C# compiler to accept something similar.
Am I missing something?