在泛型Dart上调用方法

问题描述 投票:0回答:1

我试图找到一种方法来调用泛型类型的方法。但找不到它。

在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

在达特我试过:

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'如何解决这个问题?如果可以的话,它将节省大量的时间和大量的代码。

generics dart
1个回答
1
投票

这不可能。在Dart中,您无法通过类型变量调用静态方法,因为必须在编译时解析静态方法,并且类型变量在运行时之前没有值。 Dart接口不是Swift协议,它们只能指定实例方法。

如果要参数化一个能够创建类型的新对象的类,则需要传递一个函数:

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

你不能单独依赖类型变量。

© www.soinside.com 2019 - 2024. All rights reserved.