On Sunday, 18 April 2021 at 23:04:26 UTC, ShadoLight wrote:
On Wednesday, 14 April 2021 at 14:06:18 UTC, FeepingCreature
wrote:
On Wednesday, 14 April 2021 at 13:43:20 UTC, Berni44 wrote:
[..]
Covariance is related ...
[..]
The opposite (contravariance) happens ...
[..]
Nice answer but, just to be clear - D only supports covariance
on return types at the moment, and doesn't support
contravariance on parameters, right?
I remember contravariance being periodically requested in the
past but, AFAICR, it has not been implemented, right? A quick
search through the forums didn't turn anything up either... and
this does not compile:
```
class A {}
class B : A {}
class Y {
public void bar (B b) {}
}
class X : Y {
public override void bar (A a){}
}
```
... That doesn't work?! Holy hell. I mean, run.dlang.io confirms,
but ... *why not*?! If you already support return type
covariance, parameter contravariance should be easy. It's the
same thing! You don't need to do anything! Any B is directly a
valid A! Like, sure, there's versions of this that don't
trivially work, like mixing interface and class parents, but
direct superclass contravariance should be easy. ... Weird. I
don't get it.
Reading https://issues.dlang.org/show_bug.cgi?id=3075 seems like
it collides with overloading. Except ... it doesn't. Because you
can't implement multiple overloaded methods with contravariance
in a subclass, because it doesn't work for interfaces anyway
(cause they occupy a different interface slot in the class and so
aren't strictly Liskov.) So the selection of the function to
override is still unambiguous.
I don't get it.