dart:代理注释用法

时间:2015-03-19 01:50:01

标签: dart proxy-classes dart-editor dart-analyzer

@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标签的使用,或者这是dart编辑器/分析器的错误?

1 个答案:

答案 0 :(得分:0)

你能做的是

@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