I have run across this issue plenty of times. I write up this sexy abstract design only to be reminded of this limitation with generics (it's present in Java as well):
interface IData {
void insert<D>(List<D> list) where D : IData;
}
class Foo : IData {
void insert(List<Foo> list) { }
}
the implemented insert SHOULD satisfy the interface insert method (IMO) but it doesn't. I guess the general rule is for the compilers to look for an exact signature rather than a method that fulfills the requirements of the generic method. One cute way to get around this is with:
abstract AData {
void insert<D>(List<D> list) where D : AData {
insert(list);
}
}
class Foo : AData {
void insert(List<Foo> list) { ... }
}
This however is a little dangerous, because I have no way to force the implementation of the concrete insert method. You could also cast to Foo in the implementation, but that creates a whole new set of possible complications.
It could be that this somehow doesn't fall with in the scope of generics. And maybe there is a plausable solution elsewhere in the language.. Dunno.