【问题标题】:Observable - Observer (java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to..)Observable - Observer (java.lang.ClassCastException: [Ljava.lang.Object; 不能转换为..)
【发布时间】:2016-07-23 13:38:00
【问题描述】:

我面临的问题是如何分离来自 Observable 的 3rd Party API notifyObservers 的 Object 数据。

该程序基于观察者模式,我能够成功地将观察者链接到第 3 方 API Observable,这会触发观察者中的更新方法。

代码: notifyObservers of Observable

public void newData(String car,String model,CustFeedBack csFeed){
     setChanged();
     notifyObservers(new Object[]{car,model,csFeed});
 }

在观察者更新方法中,我正在尝试强制转换 arg 以便我可以从 nofifyObservers 获取 Object 中的 3 个数据中的每一个

@Override
public void update(Observable observable, Object arg) {
        dataSubject = (DataSubject) arg;
        System.out.println(dataSubject.length);
        display();
 }

我得到一个 java.lang.ClassCastException: [Ljava.lang.Object;无法转换为...希望我面临的问题很清楚并等待有关如何继续将对象数据分解为 3 个单独部分的指导。

【问题讨论】:

  • update 正在被您的 notifyObservers 方法调用,我猜?您正在将一个对象数组传递给那些update 方法,并试图将此数组转换为一种类型。我认为您应该将其转换为对象数组。应该类似于Object[] values = (Object[])arg
  • @Alex 我也试过了,但仍然得到 ClassCastException (java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lpkg1.Model.DataSubject;)跨度>
  • 当您在有问题的行 (dataSubject = (DataSubject) arg;) 上放置断点时,调试器会说什么? arg 包含什么,它的类型是什么?也许这是你没想到的。
  • @Alex 在调试中我确实注意到 arg 包含我期望的值。无法弄清楚我在这里搞砸了什么..
  • 这听起来很奇怪。我不知道您项目的尺寸,但您可以考虑“提取”所需的值,而不是将它们传递给观察者方法。你的观察者知道 Observable(你的第一个参数)并且可以调用它的方法来收集所需的信息。它实际上不是针对您的特定问题的解决方案,但您可以解决它。

标签: observer-pattern observers


【解决方案1】:

这是我的评论作为答案:)

update 正在被您的notifyObservers 方法调用,我猜?您正在将一个对象数组传递给这些更新方法,并试图将此数组转换为一种类型。我认为您应该将其转换为对象数组。应该类似于Object[] values = (Object[])arg

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2014-05-09
    • 2015-02-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多