我最近刚刚回到Java编程中,目前我遇到了一个问题。
我有一个特定类型的对象:
StandardClass stdClass = (StandardClass)request.getAttribute(ATTR);
但是现在我需要让Object stdClass成为一些Observable的观察者 由于StandardClass没有实现Observer接口,因此无法直接将其添加为观察者。 所以我试过了:
ExtendedClass extends StandardClass implements Observer { ... }
但是我找不到将原始对象强制转换为新类的方法。
可能这整个方法都是完全错误的,我现在看不到森林的树木,所以我很感激如何解决这类问题。
非常感谢您的时间和帮助,我非常感谢!!
干杯,
托马斯
答案 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