代码之家  ›  专栏  ›  技术社区  ›  Samuel

使用接口[Java]中未定义的方法

  •  0
  • Samuel  · 技术社区  · 16 年前

    我实现了这个类[项]。

    信息项。

    传递的参数项有一个变量'Recorded'[boolean],我想使用在InfoItem实现中定义的changererecorded()方法对其进行编辑。

    谢谢!!

    -塞缪尔-

    3 回复  |  直到 16 年前
        1
  •  4
  •   David Z    16 年前

    在方法中 watchProgram ,Java只知道参数是 InfoItem . 这个论点可能是,也可能不是 Item ,因此它可能有也可能没有这种方法 changeRecorded . 由于Java不能保证对象具有该方法,因此在编译类时,它不能插入调用该方法的代码。就Java编译器而言,方法 更改记录 参数中不存在 item .

    通常当你遇到这样的情况,这是一个信号,你不应该真的这么叫 首先是方法。仔细考虑一下为什么您认为您需要它,以及如何在不使用它的情况下更改自己的代码。例如,如果有人打电话给你的 信息项 更改记录 监视程序 你知道吗?

    如果经过仔细考虑,你决定 真正地 更改记录 项目 ,您可以使用强制转换来执行此操作:

    watchProgram(InfoItem item) {
        // do stuff
        if (item instanceof Item) { // thanks to ruslan for if statement
            Item castedItem = (Item)item;
            castedItem.changeRecorded();
        }
        // do stuff
    }
    

    但正如我所说,这种东西应该少用。面向对象编程(特别是多态性)的全部目的就是让您 我必须这么做。

        2
  •  1
  •   ruslan    16 年前

    您可以尝试下一个技巧,这可能是您的一个选择:

    if (item instanceof Item) {
        Item myItem = (Item) item;
        myItem.changeRecorded();
    }
    

    这里我们检查参数item是否是item类的类型,然后将其转换为这种类型并调用item.changeRecorded()方法。

        3
  •  1
  •   DJClayworth    16 年前
    if (item instanceof Item) {
      ((Item)item).changeRecorded();
    }
    

    但是,请注意,如果可以避免的话,这不是一个好的做法。我想看看是否有办法只使用接口中定义的方法来实现您想要的功能,可能是通过使更改成为其他方法的副作用。