Open
Description
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.