web-dev-qa-db-ja.com

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
}

どちらのサブクラスも、fooへの引数がオブジェクトであるというエラーを生成します。

これは私の側の構文エラーにすぎないと確信していますが、ドキュメントを検索しましたが、答えが見つかりません。

8
jfp

ジェネリックメソッドには、クラスパラメータタイプに直接関連しないタイプパラメータがあります。

ジェネリックなしでクラスにジェネリックメソッドを持つことができます:

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);
}

あなたの場合、メソッドにtypeパラメーターは必要ありません。

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
}

しかし、ここで必要なジェネリックメソッドの概念はありません。

3

クラスのジェネリック型パラメーターを使用しているだけなので、ジェネリックメソッドが導入される前にすでに実行している可能性があります。この目的のために、問題を修正するためにメソッドの型パラメーターを削除するだけです。

ジェネリックメソッドは、呼び出しサイトではなく、メソッドを特殊化する型を渡すことを許可することです。

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

そしてそれを次のように使用します

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