Skip to content

LUB missing case #60868

Open
Open
@FMorschel

Description

@FMorschel

Repro:

// Items
sealed class Foo {
  const Foo();
}

final class Bar extends Foo {
  const Bar();
}

final class Baz extends Foo {
  const Baz();
}

// Holders
sealed class Alpha<T extends Foo> {
  const Alpha({required this.first});

  final T first;
}

sealed class Beta<T extends Foo, U extends Foo> extends Alpha<T> {
  Beta({required this.second, required super.first});

  final U second;
}

abstract interface class AlphaBar extends Alpha<Bar> {
  AlphaBar({required super.first});
}

abstract interface class AlphaBaz extends Alpha<Baz> {
  AlphaBaz({required super.first});
}

// Concrete holders for items
final class BetaBarFoo<T extends Foo> extends Beta<Bar, T>
    implements AlphaBar {
  BetaBarFoo({required super.second, required super.first});
}

final class BetaBazFoo<T extends Foo> extends Beta<Baz, T>
    implements AlphaBaz {
  BetaBazFoo({required super.second, required super.first});
}

void foo(BetaBazFoo q, BetaBarFoo p) {
  final list = [q, p];
}

I was expecting list to be at least List<Alpha<Foo>>, but I get List<Object>. It does work fine if I add Alpha/Beta as the literal generic.

I'm not sure if my expectations are correct.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-languageDart language related items (some items might be better tracked at github.com/dart-lang/language).type-questionA question about expected behavior or functionality

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions