我试图找到一种方法来调用泛型类型上的方法.但是找不到.

用Swift 我可以这样写:

protocol SomeGeneric {
    static func createOne() -> Self
    func doSomething()

}

class Foo: SomeGeneric {
    required init() {

    }
    static func createOne() -> Self {
        return self.init()
    }

    func doSomething() {
        print("Hey this is fooooo")
    }
}

class Bar: SomeGeneric {
    required init() {

    }

    static func createOne() -> Self {
        return self.init()
    }

    func doSomething() {
        print("Hey this is barrrrrrr")
    }
}

func create<T: SomeGeneric>() -> T {
    return T.createOne()
}

let foo: Foo = create()
let bar: Bar = create()

foo.doSomething() //prints  Hey this is fooooo
bar.doSomething() //prints  Hey this is barrrrrrr

在DART中,我try 过:

abstract class SomeGeneric {
  SomeGeneric createOne();
  void doSomething();
}

class Foo extends SomeGeneric {
  @override
  SomeGeneric createOne() {
    return Foo();
  }

  @override
  void doSomething() {
    print("Hey this is fooooo");
  }
}

class Bar extends SomeGeneric {
  @override
  SomeGeneric createOne() {
    return Bar();
  }

  @override
  void doSomething() {
    print("Hey this is barrrrr");
  }
}

T create<T extends SomeGeneric>() {
  return T.createOne();//error: The method 'createOne' isn't defined for the class 'Type'.
}

代码给出错误The method 'createOne' isn't defined for the class 'Type' 如何解决这个问题?如果这是可能的,它将节省大量的时间和大量的代码行.

推荐答案

这是不可能的.在DART中,您不能通过类型变量调用静电方法,因为静电方法必须在编译时解析,并且类型变量直到运行时才有值.DART接口不是SWIFT协议,它们只能指定实例方法.

如果要参数化一个类,使其能够创建某个类型的新对象,则需要传递一个执行此操作的函数:

void floo<T>(T create(), ...) { 
   ...
   T t = create();
   ...
}

不能仅依靠类型变量来实现这一点.

Dart相关问答推荐

Dart 可空记录与模式匹配:(String, int)?类型的匹配值无法分配给所需类型(Object?, Object?)

日期时间时区反序列化

Flutter/Dart:子类化冻结的数据类

如何将 Dart 代码迁移到不可空 (NNBD)?

错误:不要从另一个包中导入实现文件

如何在 Dart 中创建一个空 Set

IOS中Webview Flutter字体太小

使用 Google Dart 进行数据库查询?

判断无状态小部件是否在Flatter中处理

如何创建一个对话框,能够接受文本输入并在Flutter中显示结果?

如何在dart中获取 map 的键列表?

如何在 Dart 中上传文件?

找到两个数字中larger/smaller的方法是什么

我们如何在 Dart 中删除一个对象?

Dart:异步抽象方法

学习 Dart 好还是我必须使用基本的 javascript?

如何在 Dart SDK 0.4+ 中使用 setInterval/setTimeout

如何在 Dart 中逐个字符地迭代字符串?

判断 datetime 变量是今天、明天还是昨天

Dart 中的 urlencoding