JEP 406 type inference
Jakob Brünker
jakob.bruenker at gmail.com
Thu Jul 8 07:58:16 UTC 2021
Ah, indeed, thank you. I didn't realize type parameters were allowed in the
pattern.
Cheers!
Jakob
On Thu, Jul 8, 2021 at 4:25 AM Vicente Romero <vicente.romero at oracle.com>
wrote:
> Hi,
>
> I think that raw types are working against you, I tried this small
> variation of your code and it compiles:
>
> import java.util.function.Function;
>
> sealed interface Either<A, B> permits Either.Left, Either.Right {
> final record Left<A, B>(A a) implements Either<A, B> {}
> final record Right<A, B>(B b) implements Either<A, B> {}
>
> default <C> Either<C, B> first(Function<A, C> f) {
> return switch (this) {
> case Left<A, B> l -> new Left<C, B>(f.apply(l.a));
> case Right<A, B> r -> new Right<C, B>(r.b);
> };
> }
> }
>
> Thanks,
> Vicente
>
> On 7/7/21 10:00 PM, Jakob Brünker wrote:
> > Hi all,
> >
> > I've been excited to try doing some things with JEP 406 for a while now,
> > and when attempting to implement some things, I stumbled over an apparent
> > shortcoming that surprised me:
> >
> > Compiling this code:
> >
> > import java.util.function.Function;
> >
> > sealed interface Either<A, B> permits Either.Left, Either.Right {
> > final record Left<A, B>(A a) implements Either<A, B> {}
> > final record Right<A, B>(B b) implements Either<A, B> {}
> >
> > default <C> Either<C, B> first(Function<A, C> f) {
> > return switch (this) {
> > case Left l -> new Left<C, B>(f.apply(l.a));
> > case Right r -> new Right<C, B>(r.b);
> > };
> > }
> > }
> >
> > with javac Either.java --enable-preview --release 18, results in
> >
> > Either.java:9: error: incompatible types: Object cannot be converted to A
> > case Left l -> new Left<C, B>(f.apply(l.a));
> > ^
> > where A is a type-variable:
> > A extends Object declared in interface Either
> > Either.java:10: error: incompatible types: Object cannot be converted to
> B
> > case Right r -> new Right<C, B>(r.b);
> > ^
> > where B is a type-variable:
> > B extends Object declared in interface Either
> >
> >
> > It seems to determine that the field b of the Right record, which should
> be
> > a B, is actually an Object, and similarly for Left.
> >
> > It's possible to implement this method with the visitor-pattern, but I
> > would have expected this to be equivalent.
> >
> > Is this intentional?
> >
> > Cheers,
> > Jakob
>
>
More information about the amber-dev
mailing list