dart: использование прокси-аннотаций

Документация для @proxy аннотация состояния:

Если класс помечен с @proxyили он реализует любой аннотированный класс, то считается, что класс реализует любой интерфейс и любой член в отношении статического анализа типов. Таким образом, это не предупреждение о статическом типе для назначения объекта переменной любого типа, и это не предупреждение о статическом типе для доступа к любому члену объекта.

Однако, учитывая следующий код:

import 'dart:mirrors';

@proxy
class ObjectProxy{
  final InstanceMirror _mirror;

  ObjectProxy(Object o): _mirror = reflect(o);

  @override
  noSuchMethod(Invocation invocation){
    print('entered ${invocation.memberName}');
    var r = _mirror.delegate(invocation);
    print('returning from ${invocation.memberName} with $r');
    return r;
  }
}

class ClassA{
  int k;

  ClassA(this.k);
}

void printK(ClassA a) => print(a.k);

main() {
  ClassA a = new ObjectProxy(new ClassA(1)); //annoying
  printK(a);
}

редактор дротиков предупреждает

A value of type 'ObjectProxy' cannot be assigned to a variable of type 'ClassA'.

Код выполняется должным образом в непроверенном режиме, но предупреждение раздражает, и, насколько я могу судить, подавление этого предупреждения - единственное, что @proxy тег должен делать.

Я неправильно понимаю использование @proxy тег, или это ошибка в редакторе / анализаторе дротиков?

1 ответ

Решение

Что вы можете сделать, это

@proxy
class ObjectProxy implements ClassA {
  final InstanceMirror _mirror;

  ObjectProxy(Object o): _mirror = reflect(o);

  @override
  noSuchMethod(Invocation invocation){
    print('entered ${invocation.memberName}');
    var r = _mirror.delegate(invocation);
    print('returning from ${invocation.memberName} with $r');
    return r;
  }
}

вам нужно заявить, что ObjectProxy реализует интерфейс, но вам не нужно его реализовывать. Если вы думаете, что это ошибка, сообщите об этом на http://dartbug.com/

Другие вопросы по тегам