contravariant argument types: wanna?

Ary Borenszweig ary at esperanto.org.ar
Wed Sep 23 04:46:48 PDT 2009


Jeremie Pelletier escribió:
> Andrei Alexandrescu wrote:
>> Hello,
>>
>>
>> Today, overriding functions have covariant return types:
>>
>> class A {
>>     A clone();
>> }
>>
>> class B : A {
>>     B clone(); // fine, overrides A.clone
>> }
>>
>> That is entirely principled and cool. Now the entire story is that 
>> overriding function may have not only covariant return types, but also 
>> contravariant argument types:
>>
>> class A {
>>     A fun(B);
>> }
>>
>> class B : A {
>>     B fun(A); // fine (in theory), overrides A.fun
>> }
>>
>> Today D does not support contravariant arguments, but Walter told me 
>> once he'd be quite willing to implement them. It is definitely the 
>> right thing to do, but Walter would want to see a compelling example 
>> before getting to work.
>>
>> Is there interest in contravariant argument types? If so, do you know 
>> of a killer example?
>>
>>
>> Thanks,
>>
>> Andrei
> 
> I can't think of an use for contravariant parameters, since a B is 
> guaranteed to always be a A, I don't see the point of being able to 
> declare fun(A).

The thing is you have this:

class C : A { }
C c;

void foo(B someB) {
   someB.fun(c);
}

If contravariant arguments are not supported then fun can only receive a 
B, not a C. If you want to pass any A you can't, but maybe B.foo relaxes 
the requirements on it's arguments. Of course you can pass B to it, 
which is already an A, but you can't pass a C which is another A. That's 
the use case.

I can't come up with a killer example for this, I know I used covariant 
return types in Java before but never contravariant argument types. But 
if it's possible to implement it, I'd go for it. It's the right thing to 
do. And academic people will thank you and be happy. :-)



More information about the Digitalmars-d mailing list