【问题标题】:Java casting objectsJava 铸造对象
【发布时间】:2012-12-27 23:43:25
【问题描述】:

我有两个班级:TeacherCoordinatorCoordinator 扩展了 Teacher

基本上我想创建一个实例变量,它可以接收Teacher 实例或Coordinator 实例。

我知道这很容易通过编写Teacher exp = new Teacher()Teacher exp = new Coordinator() 来实现,但是当我这样做时,我只能在应用new Coordinator()new Teacher() 时访问Teacher 方法和属性参考变量是正常的。我的问题是,是否有另一种方法,我只使用一个可以分配给 Teacher OR Coordinator 对象的实例变量,并使用此变量来调用分配给对象引用变量的对象的任何属性/方法?

【问题讨论】:

  • 您确实意识到可以从现有类扩展类。您已经编写的代码将如何预测您尚未扩展的类的方法?反射 API 是唯一健全的机制。其他选项是编写保证指定类所需协议的接口。
  • 你怎么知道它是不是Coordinator

标签: java class variables reference casting


【解决方案1】:

您可以检查 exp 是否为 Coordinator 然后转换并相应地调用其函数:

if(exp instanceof Coordinator) {
    ((Coordinator)exp).foo();
}

如果你有几件事要做,你可以在本地范围内创建一个变量并重复使用它:

if(exp instanceof Coordinator) {
    Coordinator expCoord = (Coordinator)exp;
    expCoord.foo();
    expCoord.bar();
    expCoord.baz();
}

【讨论】:

  • 那么这样做之后,Teacher exp(分配给一个协调器对象)会不会永久变成Coordinator exp
  • 没有。它仅适用于第一个示例中的该表达式或第二个示例中的该范围。
【解决方案2】:

除非您要调用的所有方法都存在于父类中,否则无法做到这一点。

您可以将 Teacher 变量中的内容转换为 Coordinator,但如果 Teacher 变量中的内容不是真正的 Coordinator 对象实例,则会失败。

((Coordinator)exp).coordinate();

【讨论】:

    【解决方案3】:

    每当您想调用Coordinator 的方法时,您必须先将该对象强制转换为Coordinator

    ((Coordinator)myTeacher).coordinatorMethod();
    

    【讨论】:

      【解决方案4】:

      不,因为类型安全。但你总是可以这样做:

      Teacher exp = new Coordinator()
      ((Coordinator)exp).someCoordinatorMethodOrProperty()
      

      【讨论】:

        【解决方案5】:

        是的,你是对的,

        这里同样的概念实现为父子关系 由于子类的实例可以访问子类和父类的属性,但是父类的实例只能访问子类的属性...

        这就是它发生的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-07
          • 2011-09-17
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-12
          • 2015-01-03
          相关资源
          最近更新 更多