我有一个抽象类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,则需要将事件强制转换为该类型,以便能够访问它的属性。但是,我在类型广播上得到了一个编译器错误,声明:
类型' type‘的值不能分配给'PlaceChangeEvent’类型的变量
我哪里出错了,我需要做些什么来解决它呢?
发布于 2013-12-31 17:46:37
在达特
B是A的一个子类,那么B b = a (其中a是类A的一个实例)警告是免费的,并悄悄地将a转换为B。在Java中,您需要编写B b = (B) a。B和C不在同一层次结构中,则临时分配给动态类型将使强制转换没有警告。
B= someB;var tmp = b;c= tmp;is进行显式检查。如果对象类型正确,则is检查将返回true。还有一些非常简单的规则可以传播is-check类型。例如,如果is在if条件中使用,则对应的分支将此信息用于类型警告。
对象o;o.foo();//警告:对象上不存在foo。如果(o是A) { //假设A包含'foo‘。o.foo();//无警告。}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时抛出。这通常是首选的方法。
发布于 2013-12-31 15:58:00
试试这个:
pce = event as PlaceChangeEvent;https://stackoverflow.com/questions/20859702
复制相似问题