Java“扩展”一个对象

时间:2010-11-09 14:38:48

标签: java inheritance interface casting observer-pattern

我最近刚刚回到Java编程中,目前我遇到了一个问题。

我有一个特定类型的对象:

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

但是现在我需要让Object stdClass成为一些Observable的观察者 由于StandardClass没有实现Observer接口,因此无法直接将其添加为观察者。 所以我试过了:

ExtendedClass extends StandardClass implements Observer { ... }

但是我找不到将原始对象强制转换为新类的方法。

可能这整个方法都是完全错误的,我现在看不到森林的树木,所以我很感激如何解决这类问题。

非常感谢您的时间和帮助,我非常感谢!!

干杯,
托马斯

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

如果request.getAttribute(ATTR)处的对象真的是Observable,那么您可以将其转换为:{/ p>

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

如果编译器知道StandardClass不是Observable,则编译器不允许您从一种类型转换为不兼容的类型。或者,您可以简单地将引用声明为ExtendedClass

答案 2 :(得分:0)

用你的方法:

request.getAttribute(ATTR);

应返回一个对象类型的ExtendedClass,以便将其强制转换为Observer,例如:

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

答案 3 :(得分:0)

如果您需要视觉效果,请查看观察者模式图

http://upload.wikimedia.org/wikipedia/commons/8/8d/Observer.svg