我有一个抽象类 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);
}
所以如果运行时类型为
event
是 PlaceChangeEvent
,然后我需要将事件转换为该类型,以便我可以访问其属性。但是我在类型转换上遇到编译器错误,说明:A value of type 'Type' cannot be assigned to a variable of type 'PlaceChangeEvent'
我哪里出错了,我需要做些什么来解决它?
最佳答案
在 Dart
B
是 A
的子类,然后 B b = a
(其中 a
是类 A
的一个实例)没有警告并默默地转换 a
至 B
.在 Java 中,您需要编写 B b = (B) a
. B
和 C
不在同一层次结构中,则临时分配给动态类型将使强制转换无警告。B b = someB;
var tmp = b;
C c = tmp;
is
进行显式检查. is
如果对象的类型正确,则 check 返回 true。还有一些非常简单的规则可以传播 is-check 类型。例如,如果 is
在 if
中使用条件,然后相应的分支使用此信息进行类型警告。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/