casting - Dart 类型转换错误

标签 casting dart

我有一个抽象类 Event以及扩展它的具体子类,称为 PlaceChangeEvent .在事件监听器中,我有以下代码:

void onEvent(Event event) {
    PlaceChangeEvent pce = null;
    if(event is PlaceChangeEvent)
        pce = (PlaceChangeEvent)event;      // <== error is here
    else
        throw new Exception("Event is not a PlaceChangeEvent.");

    Place place = pce.place;

    presenterProvider.display(place);
}

所以如果运行时类型为 eventPlaceChangeEvent ,然后我需要将事件转换为该类型,以便我可以访问其属性。但是我在类型转换上遇到编译器错误,说明:

A value of type 'Type' cannot be assigned to a variable of type 'PlaceChangeEvent'



我哪里出错了,我需要做些什么来解决它?

最佳答案

在 Dart

  • upcasts 是隐式的。如 BA 的子类,然后 B b = a (其中 a 是类 A 的一个实例)没有警告并默默地转换 aB .在 Java 中,您需要编写 B b = (B) a .
  • 动态类型是一个始终存在的逃生舱口。如 BC不在同一层次结构中,则临时分配给动态类型将使强制转换无警告。
    B b = someB;
    var tmp = b;
    C c = tmp;
    
  • 可以使用 is 进行显式检查. is如果对象的类型正确,则 check 返回 true。还有一些非常简单的规则可以传播 is-check 类型。例如,如果 isif 中使用条件,然后相应的分支使用此信息进行类型警告。
    Object o;
    o.foo();  // warning: foo does not exist on Object.
    if (o is A) {  // assuming that A contains 'foo'.
      o.foo();  // warning-free.
    }
    
  • 如果类型不是预期的类型,可以使用 as 显式检查并抛出.当左侧为 null 时,此运算符不会抛出异常.

  • 对于您的示例,这归结为:

    没有明确的检查(1):

    void onEvent(Event event) {
      // Implicit upcast. PlaceChangeEvent is subclass of Event.
      PlaceChangeEvent pce = event;
      Place place = pce.place;
      presenterProvider.display(place);
    }
    

    使用 is-check (3):

    void onEvent(Event event) {
      if (event is PlaceChangeEvent) {
        // Static type system propagates type. No need for variable.
        Place place = event.place;
        presenterProvider.display(place);
      } else {
        // Note: this doesn't look like an exception, but an error.
        throw new Exception("Event is not a PlaceChangeEvent.");
      }
    }
    

    使用 as (4):

    void onEvent(Event event) {
      Place place = (event as PlaceChangeEvent).place;
      presenterProvider.display(place);
    }
    

    或者,如果您希望收到 PlaceChangeEvent,您应该简单地更改参数的类型:

    void onEvent(PlaceChangeEvent event) {
      Place place = event.place;
      presenterProvider.display(place);
    }
    

    在检查模式下,这将捕获错误类型,在未检查模式下,它会在访问 event.place 时抛出。 .这通常是首选方式。

    关于casting - Dart 类型转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20859702/

    相关文章:

    firebase - 为什么文档不存在。但始终 !snapshot.hasData 都是 false

    android - 缺少用于共享首选项的平台异常错误和iOS Flutter中的Flutter Toast插件

    c - C 中的指针转换

    javascript - 您如何将Polymer用作dart用作javascript?

    Angular 2 Dart : How to detect click on everything but element?

    c - 当您将整数值类型转换为 char 指针时会发生什么?

    firebase - 任务 ':cloud_firestore:extractDebugAnnotations'的执行失败

    c - 这个C Actor 有什么问题

    flash - 如何将一个类中制作的 movieClip 的引用传递给另一个类?

    c++ - 将 vector 值复制到 char*