【问题标题】:Dart Implicit Compound Generics?Dart 隐式复合泛型?
【发布时间】:2021-09-02 13:03:30
【问题描述】:

考虑以下几点:

class ModularRoute<TPageParameters extends PageParameters,
        TModularPage extends ModularPage<TPageParameters>>
    extends BaseModularRoute<TPageParameters, TModularPage> {
  ModularRoute({
    required BaseModule module,
    required String route,
    required TModularPage Function(Map<String, String?> params) createPage,
    FutureOr<bool> Function(
      ModularHistory route,
      ModularRouterDelegate delegate,
    )?
        guard,
    bool overrideModuleGuard = false,
  }) : super(
          module: module,
          route: route,
          createPage: createPage,
          guard: guard,
          overrideModuleGuard: overrideModuleGuard,
        );

要实际构造它,我必须每次都定义泛型的两个参数。即:

ModularRoute<SomePageParameter, SomeModularPage>(...);

在 Dart 中有没有办法以复合方式定义它,以便参数泛型由 ModularPage 的泛型类型定义? IE。我想这样定义它:

class ModularRoute<TModularPage extends ModularPage<TPageParameters extends PageParameters>> {
   ...
}

然后就完成了。

这当然行不通,但我在 Dart 中经常遇到这个问题,它无缘无故地创建了冗长的代码,因为编译器应该能够轻松地推断出所涉及的泛型类型,然后使用它们。

【问题讨论】:

    标签: dart


    【解决方案1】:

    没有。

    如果你的类依赖两个类型参数,它需要声明两个独立的类型参数。没有办法隐式地从另一种类型中挑选出其中一种类型。如果它需要一个名字,你必须让它成为一个实参。

    【讨论】:

    • 太糟糕了,因为 Dart 的泛型真的很弱,并且不能像 .NET 那样推断出几乎一样的东西,所以你不断地定义泛型,或者它为你定义它们而没有错误,因为动态导致各种的错误。这可能是 Dart 最大的缺点。 (并且真正的编译时反射不存在是非常可怕的,导致在不需要时使用 build_runner)
    猜你喜欢
    • 2021-08-25
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2015-11-28
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多