abstract datum ??
Remi Forax
forax at univ-mlv.fr
Fri Nov 10 14:15:58 UTC 2017
----- Mail original -----
> De: "Maurizio Cimadamore" <maurizio.cimadamore at oracle.com>
> À: "Robert Gibson" <robbie_usenet at yahoo.co.uk>, "Vicente Romero" <vicente.romero at oracle.com>
> Cc: "amber-dev" <amber-dev at openjdk.java.net>
> Envoyé: Jeudi 9 Novembre 2017 19:22:35
> Objet: Re: [datum] initial public push (IPP)
[...]
>> And there are more pitfalls of course around inheritance, although the rule of
>> “only one concrete class in a hierarchy” eases the pain a little.
> Not sure about this. On the one hand, under the current proposal, only
> concrete datum (leaves in the hierarchy) get an equals method. So you
> could just say that the stricter equals and the associated bridge is
> only generated on such leaves. But that leaves out cases like these:
>
> abstract datum AbstractPoint(int x, int y);
it works using generics with a recursive bound that describe itself
abstract datum AbstractPoint<P extends AbstractPoint<P>>(int x, int y) {
**synthetic** boolean equals(Object o) {
if (o instanceof AbstractPoint) {
return equals((AbstractPoint<?>)o);
} else {
return false;
}
}
}
>
> datum Point(int x, int y) extends AbstractPoint(x, y);
datum Point(int x, int y) extends AbstractPoint<Point>(x, y);
>
> Point p = ...
> p.equals(""); //error
> ((AbstractPoint)p).equals(""); // ok?
>
> And if we want the last statement above to be an error, does it mean we
> have to generate an equals(AbstractDatum) on the intermediate leave?
> Maybe. But then:
>
> AbstractPoint ap = ...
> Point p = ...
> p.equals(ap); //error
> ((AbstractPoint)p).equals(ap); // ok?
>
>
> Seems can-of-wormey...
>
> Maurizio
But more fundamentally, given that we now have default methods and an easy way to declare fields, i do not understand why the spec allow to declare abstract datum.
By example,
interface Foo {
abstract int m();
}
abstract datum AbstractFoo(int x) implements Foo {
public int m() { return x * 2; }
}
datum Bar(int x, int y) extends AbstractFoo(x);
can always be simplified to:
interface Foo {
default int m() { return x() * 2; }
abstract int x();
}
datum Bar(int x, int y) implements Foo;
regards,
Rémi
More information about the amber-dev
mailing list