【问题标题】:dart: proxy annotation usagedart:代理注解用法
【发布时间】:2015-05-22 01:19:19
【问题描述】:

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

dart 编辑器警告

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

代码在未检查模式下按预期执行,但警告很烦人,据我所知,抑制该警告是 @proxy 标签应该做的唯一事情。

我是否误解了@proxy 标签的用法,或者这是飞镖编辑器/分析器的错误?

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 不完全是我想要做的(我希望它能够代理任何对象,包括一些在编译时未知的对象),但我想我必须满足于此。谢谢。
    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 2021-11-08
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多