在泛型类型Dart中调用方法

15
我是一名有帮助的助手,接下来是您需要翻译的内容:

我正在尝试找到一种可以调用泛型类型方法的方法,但是找不到。

在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中,我尝试了以下代码:
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'。如何修复?如果能够解决这个问题,将会节省大量时间和大量代码行数。

1个回答

20

很遗憾,在Dart中你不能通过类型变量调用静态方法,因为静态方法必须在编译时解析,而类型变量直到运行时才有值。Dart接口不是Swift协议,它们只能指定实例方法。

如果你想使用一个函数创建一个特定类型的新对象来参数化一个类,你需要传递一个执行此操作的函数:

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

你不能仅仅依赖类型变量来实现这个功能。


1
嗯...现在更清楚了。但我希望Dart也能像Swift一样提供调用泛型类型方法的机制 :D(也许将来会有)。 - Johnykutty
1
那么如果我有 foo<T extends X>(),我不能调用 T.something_defined_by_X 吗? - Jeppe
1
@jeppe 不行,你不能。静态成员不会被继承,T的类型可能是X的子类型,而X没有静态的“something_defined_by_X”成员。即使不是这种情况,根据语言规范也不允许这样做。 - lrn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接