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

jfp*_*jfp 6 generics generic-method dart

我正在尝试在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
}
Run Code Online (Sandbox Code Playgroud)

这两个子类均生成错误,指出to的参数foo是一个Object。

我确定这只是我的语法错误,但是我已经搜索了文档并且找不到答案。

Gün*_*uer 12

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

泛型方法允许传递专门用于调用站点的方法的类型

class MyClass {
  T myMethod<T>(T param) {
    prinz(param);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

new MyClass().myMethod<List<String>>(['a', 'b', 'c']);
Run Code Online (Sandbox Code Playgroud)

  • `T myMethod&lt;T extends SomeType&gt;`。另请参阅/sf/ask/1308921141/ (4认同)

Ale*_*uin 7

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

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

class MyClass {
  T add<T>(T f()) => f();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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
}
Run Code Online (Sandbox Code Playgroud)

但是这里不需要泛型方法的概念。