首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dart排版误差

Dart排版误差
EN

Stack Overflow用户
提问于 2013-12-31 15:47:06
回答 2查看 10.5K关注 0票数 7

我有一个抽象类Event和一个扩展它的具体子类PlaceChangeEvent。在事件侦听器中,我有以下代码:

代码语言:javascript
复制
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);
}

因此,如果event的运行时类型为PlaceChangeEvent,则需要将事件强制转换为该类型,以便能够访问它的属性。但是,我在类型广播上得到了一个编译器错误,声明:

类型' type‘的值不能分配给'PlaceChangeEvent’类型的变量

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

EN

回答 2

Stack Overflow用户

发布于 2013-12-31 17:46:37

在达特

  1. 向上的是隐含的。如果BA的一个子类,那么B b = a (其中a是类A的一个实例)警告是免费的,并悄悄地将a转换为B。在Java中,您需要编写B b = (B) a
  2. 动态类型是一个始终存在的逃生舱口.如果BC不在同一层次结构中,则临时分配给动态类型将使强制转换没有警告。 B= someB;var tmp = b;c= tmp;
  3. 可以使用is进行显式检查。如果对象类型正确,则is检查将返回true。还有一些非常简单的规则可以传播is-check类型。例如,如果isif条件中使用,则对应的分支将此信息用于类型警告。 对象o;o.foo();//警告:对象上不存在foo。如果(o是A) { //假设A包含'foo‘。o.foo();//无警告。}
  4. 如果一个类型不是as所期望的类型,则可以显式地检查和抛出。当左边是null时,这个操作符不会抛出.

就您的例子而言,这可以归结为:

没有明确的检查(1):

代码语言:javascript
复制
void onEvent(Event event) {
  // Implicit upcast. PlaceChangeEvent is subclass of Event.
  PlaceChangeEvent pce = event;
  Place place = pce.place;
  presenterProvider.display(place);
}

使用is-check (3):

代码语言:javascript
复制
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):

代码语言:javascript
复制
void onEvent(Event event) {
  Place place = (event as PlaceChangeEvent).place;
  presenterProvider.display(place);
}

或者,如果您希望接收一个PlaceChangeEvent,则只需更改参数的类型:

代码语言:javascript
复制
void onEvent(PlaceChangeEvent event) {
  Place place = event.place;
  presenterProvider.display(place);
}

在选中模式下,这将捕获坏类型,而在未检查模式下,它将在访问event.place时抛出。这通常是首选的方法。

票数 8
EN

Stack Overflow用户

发布于 2013-12-31 15:58:00

试试这个:

代码语言:javascript
复制
pce = event as PlaceChangeEvent;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20859702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档