Dart:如何重写泛型方法?

Dart: how to override a generic method?

考虑我的以下基础 class:

abstract class IChat<Message extends IMessage> {

  String get getId;
  
  List<T> getUsers<T extends IUser>();

}

现在我的扩展模型如下所示:

class Chat extends IChat<ChatMessage> {
  String id;
  List<ChatUser> members;

  Chat({this.chat, this.members});


  @override
  String get getId => id;

  @override
  List<T> getUsers<T extends IUser>() => members;
  
}

List<T> getUsers<T extends IUser>() => members; 抛出错误,因为我 return List<ChatUser> 而不是 List<T>。我如何重写该方法以使其工作?我的 ChatUser class 显然也扩展了 IUser.

编辑

@jamesdlin 给出了一种解决方案:@override List<T> getUsers<T extends IUser>() => members.cast<T>()。没有类型转换是可能的吗?

首先考虑您实际上想要您class要做的事情。

似乎 subclass 有一个特定类型的 IUser 它总是想要 return,但是泛型函数采用它的类型参数 per调用。因此,类型可能应该是 class 的 属性,而不是调用的 属性。

考虑:

abstract class IChat<Message extends IMessage> {

  String get getId;
  
  List<IUser> getUsers();
}

class Chat extends IChat<ChatMessage> {
  String id;
  List<ChatUser> members;

  Chat({this.chat, this.members});

  @override
  String get getId => id;

  @override
  List<ChatUser> getUsers() => members;
}

这样能满足你的需求吗?

作为风格评论,您的代码很像 C#,看起来不像 Dart。我可能会将 classes 声明为:

abstract class Chat<M extends Message> {
  String get id;
  List<User> get users;
}

class SomeChat extends Chat<ChatMessage> {
  @override
  final String id;
  @override
  List<ChatUser> users;
  // ...
  SomeChat({this.id, List<CharUser> members, ...}) : users = members;
  // ...
}