2010-11-09 110 views
0

我最近才回到Java编程中,目前我遇到了一些问题。Java“扩展”对象

我有一定类型的对象:

StandardClass stdClass = (StandardClass)request.getAttribute(ATTR); 

但现在我需要做的对象stdClass的一些可观测的观测。
因为StandardClass没有实现Observer接口,我不能直接将它作为观察者添加。 所以,我想:

ExtendedClass extends StandardClass implements Observer { ... } 

但我一直没能找到一种方法来投的原始对象到新类。

可能这整个方法是完全错误的,我目前无法看到树木的森林,所以我很感激任何关于如何解决这类问题的意见。

非常感谢您的时间和帮助,我真的很感激它!

干杯,
托马斯

+0

Can not y你让'StandardClass'实现'Observer'? – 2010-11-09 14:42:53

回答

3

你将不能够对原始对象铸在ExtendedClass,因为它是这个类的一个实例。子类的存在并不意味着超类实例可以以某种方式强制进入这些子类。在这种情况下,您的stdClass对象仅是StandardClass的实例,因此无法成功向下转发。

编辑澄清:当然,存储在StandardClass变量中的一些对象实际上可能是ExtendedClass对象。我的理解是,你没有修改存储在请求中的实际对象,只是创建了一个子类。当你说你不能执行演员时,我推测你的意思是演员在运行时失败了ClassCastException(某些演员将被编译器拒绝,因为他们不能成功,例如Integer永远不能投射到String,但这不应该是这种情况之一)。如果您创建子类修改了您的应用程序,以便将存储在请求中的对象创建为ExtendedClass对象,则应该成功执行投射。

达到你想要做什么,更清洁的方法是某种wrapper class,其中包含一个StandardClass实例,并实现了Observer方法本身。然后它可以调用StandardClass上适当的方法来响应观察到的事件。

+0

非常感谢您的意见! 我以前实际上已经使用过包装类方法,但问题是,StandardClass有一个超时函数,在这种情况下,它将不得不通知包装类从observable中注销自己。 – 2010-11-09 15:32:17

1

如果request.getAttribute(ATTR)对象确实是一个Observable,那么你可以将它转换为这样:

Observable obs = (Observable) request.getAttribute(ATTR); 

编译器不会让你从一种类型强制转换为不兼容的类型,如果它知道StandardClass不是Observable。或者,您可以简单地声明参考文献为ExtendedClass

0

你的方法:

request.getAttribute(ATTR); 

应以将其转换为一个观测器的例子来返回ExtendedClass的对象类型:

Observer observer = (Observer) request.getAttribute(ATTR);