Я не могу понять, как работает isSubtypeOf в зеркалах Dart

Согласно этому тесту, я не могу вызвать метод «метод» с аргументом «список», потому что тип аргумента несовместим с типом параметра метода.

Где я ошибаюсь в своем тесте?

import "dart:mirrors";

void main() {
  var list = new List<String>();
  var listMirror = reflectClass(list.runtimeType);
  // Is "List<String>" subtype of "List<String>"?
  print(listMirror.isSubtypeOf(listMirror));
  // Method with parameter "List<String>"
  var method = (List<String> list) {};
  var closure = reflect(method) as ClosureMirror;
  var function = closure.function;
  var parameter = function.parameters.first;
  // Is "List<String>" subtype of "List<String>"?
  print(parameter.type.isSubtypeOf(listMirror));
  print(listMirror.isSubtypeOf(parameter.type));
  // Invoke method with arg: "List<String>" on param "List<String>"
  method(list);
}

Выход:

true
false
false

P.S.

Может я чего-то не понимаю, но все равно не работает.

import "dart:mirrors";

void main() {
  var stringMirror = reflectClass(String);
  // Query "List<int> get codeUnits"
  MethodMirror method = stringMirror.declarations.values
      .where((e) => e.simpleName == #codeUnits).first;

  // List<int>
  var returnType = method.returnType;
  print(returnType);

  // List
  var baseType = reflectClass(List);
  print(baseType);

  // List<int> is List
  print(returnType.isSubtypeOf(baseType));
}

Выход:

ClassMirror on 'List'
ClassMirror on 'List'
false

person mezoni    schedule 06.04.2014    source источник


Ответы (1)


Эта строка является виновником:

var listMirror = reflectClass(list.runtimeType);

он возвращается

ClassMirror on '_GrowableList'

если вы используете

var listMirror = reflectType(List);

он должен работать.

Что вы можете, когда вам нужно получить тип из значения во время выполнения

var listMirror = reflect(list).type.superinterfaces;
...
listMirror.forEach((e) => print(parameter.type.isSubtypeOf(e)));

в зависимости от ситуации вам может потребоваться выполнить дополнительные проверки с помощью

reflect(list).type.mixin;

Если хотя бы одна из этих проверок верна, это подтип.

person Günter Zöchbauer    schedule 06.04.2014
comment
Я расширил свой ответ, возможно, он включает в себя то, что вы хотите. - person Günter Zöchbauer; 06.04.2014
comment
Если вы измените reflectClass на reflectType, будет напечатано true. Это то, что вы хотите? - person Günter Zöchbauer; 06.04.2014