How to create a generic method in Dart?

▼魔方 西西 提交于 2020-05-12 19:10:36

问题


I'm trying to use generic methods in Dart (1.22.0-dev.10.3). Here is a simple example:

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
}

Both subclasses generate errors that say the argument to foo is an Object.

I'm sure this is just a syntactic error on my part, but I've searched the documentation and can't find an answer.


回答1:


What you are doing could be done already before generic methods were introduced because you're just using the generic type parameter of the class. For this purpose just remove the type parameters on the methods to fix the problem.

Generic methods are to allow to pass a type that specializes a method no the call site

class MyClass {
  T myMethod<T>(T param) {
    console.log(param);
  }
}

and then use it like

new MyClass().myMethod<List<String>>(['a', 'b', 'c']);



回答2:


Generic methods have type parameters that are not directly related to their class parameter types.

You can have a generic method on a class without generic:

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

You can also have a generic method on a class with generic:

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

In your case, you don't need the type parameter on the methods:

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
}

But there are no concept of generic method needed here.



来源:https://stackoverflow.com/questions/42004475/how-to-create-a-generic-method-in-dart

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!