【问题标题】:Generic field/method in non-generic class in DartDart 中非泛型类中的泛型字段/方法
【发布时间】:2021-11-04 06:45:22
【问题描述】:

在 Dart 中,是否有可能在非泛型类中拥有泛型方法,就像在 Java 中一样?

我使用Getx 进行状态管理、DI 和路由,但这个问题并不特定于 Getx 或 Flutter。

我有AuthService,它处理身份验证并设置登录用户,例如Rxn<AppUser>。我有 3 种类型的用户:Customer extends AppUserSeller extends AppUserAdmin extends AppUser

我想将可观察的用户更改为:Rxn<? extends AppUser> currentUser = Rxn()

我尝试了以下语法,但不起作用。

class AuthService extends GetxService {
  T Rxn<T extends AppUser> currentUser = Rxn();
  ...
}

直接回答我的问题: Dart 也支持泛型类型的继承(与 Java 不同)。所以,Rxn&lt;AppUser&gt; currentUser = Rxn&lt;Patient&gt;() 在 Dart 中是可能的。我不需要通配符或任何通配符。感谢@jamesdlin 的回答/cmets。

【问题讨论】:

    标签: flutter dart generics flutter-getx


    【解决方案1】:

    你可以有泛型方法。声明它们的方式与声明泛型函数的方式相同:

    class Foo {
      String key;
    
      Foo(this.key);
    
      Map<String, T> f<T>(T value) => <String, T>{key: value};
    }
    

    但是,拥有通用字段是没有意义的。一个字段代表一个数据成员;什么数据将被存储,何时类型未知?对于T 的每个可能值,您是否会存储可能无限数量的数据成员?

    【讨论】:

    • 通用字段确实有好处。使用Rx&lt;? extends AppUser&gt; currentUser 之类的东西,我可以强制分配仅属于子类型,例如currentUser = Rx&lt;Admin&gt;(),但不是currentUser = Rx&lt;Foo&gt;()
    • Dart 是否支持 Rx&lt;? extends AppUser&gt; currentUserRx&lt;T extends AppUser&gt; currentUser 或类似的字段/属性语法?谢谢
    • @manikanta 那你为什么不把你的字段声明为Rx&lt;AppUser&gt; currentUser呢?或者为什么不让这个类通用?您还可以将成员设为私有并提供通用函数来获取和设置它(以及转换为基类型和从基类型转换)。
    • 哦,Dart 也支持泛型继承!!! Rxn&lt;AppUser&gt; t = Rxn&lt;Patient&gt;() 在 Dart 中有效。刚刚检查了语法。我是 Java 背景的,Java 不允许这样做。
    • 我可以将类设为通用类,但在这种特定情况下,我将只有一个 AuthService 用于所有类型的用户。因此,在AuthService 中将用户类型设置为通用类型在这里没有意义。谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多