如何在Dart中创建通用方法?

时间:2017-02-02 14:15:22

标签: generics dart generic-method

我正在尝试在Dart中使用泛型方法(1.22.0-dev.10.3)。这是一个简单的例子:

abstract class VR<T> {
  VR();

  bool foo<T>(T value);
}

class VRInt extends VR<int> {
  VRInt();

  bool foo<int>(int n) => n > 0; // Thinks n is Object
}

class VRString extends VR<String> {
  VRString();

  bool foo<String>(String s) => s.length > 0; // Thinks s is Object
}

两个子类都会产生错误,表明foo的参数是一个Object。

我确信这只是我的一个语法错误,但我搜索了文档并找不到答案。

2 个答案:

答案 0 :(得分:3)

通用方法的类型参数与其类参数类型没有直接关系。

您可以在没有泛型的类上使用泛型方法:

class MyClass {
  T add<T>(T f()) => f();
}

您还可以在具有泛型的类上使用泛型方法:

class MyClass<A> {
  A aInstance;
  // here <T> is needed because unrelated to <A>
  T add<T>(T f(A a)) => f(aInstance);
}

在您的情况下,您不需要方法的类型参数:

abstract class VR<T> {
  VR();

  bool foo(T value);
}

class VRInt extends VR<int> {
  VRInt();

  bool foo(int n) => n > 0; // Thinks n is Object
}

class VRString extends VR<String> {
  VRString();

  bool foo(String s) => s.length > 0; // Thinks s is Object
}

但这里不需要通用方法的概念。

答案 1 :(得分:2)

在引入泛型方法之前,您正在做的事情已经完成,因为您只是使用类的泛型类型参数。 为此,只需删除方法上的类型参数即可解决问题。

通用方法是允许传递专门没有调用站点

的方法的类型
class MyClass {
  T myMethod<T>(T param) {
    console.log(param);
  }
}

然后像

一样使用它
new MyClass().myMethod<List<String>>(['a', 'b', 'c']);