【问题标题】:Pointer-like behavior in JavaJava中类似指针的行为
【发布时间】:2010-04-09 13:58:13
【问题描述】:

我得到了以下信息:

class A{  
    int foo;  
}  
class B extends A{  
    public void bar();  
}

我得到了一个 A 的实例,想将它转换为 B 的一个实例,同时又不丢失对变量 foo 的引用。

例如:

A a = new A();  
a.foo = 2;  
B b = a; <-- what I want to do.  
//use b  
b.foo = 3;  
//a.foo should now be 3

感谢您的帮助!

【问题讨论】:

  • 您可能想尝试一些“组合而不是继承”,或者添加一个额外的间接层。

标签: java reference class pointers extends


【解决方案1】:

Java 不支持这个。您可以利用多态性将B 的实例视为A 的实例,但不能反过来。

您不能这样做的原因是因为没有类型安全的方法来保证您的 A 实例实际上是 B 的实例(您可以转换该实例,但即使您这样做了保证自己在执行时例外)。

判断类型之间是否存在类型安全、多态关系的最佳方法是测试此语句的有效性:

某种类型的任何实例都是某种其他类型的实例。

例如:

任何 Dog 的实例都是 Mammal 的实例。
任何 Mammal 的实例都是 Dog 的实例。

请注意,第一个示例为真,而第二个示例为假。您在代码示例中尝试做的事情就像尝试将任何哺乳动物视为狗一样 - 尽管有时它可能是正确的,但绝对不是正确的,这意味着编译器不会允许它。

再一次,当它可能是真的时,您必须强制转换引用,但这会在执行时为您打开异常。您上面的具体示例是发生异常的情况之一,因为我们可以清楚地看到您已经实例化了 A 类型的实例。

【讨论】:

    【解决方案2】:

    使用复制构造函数:

    class B extends A{  
        public B(A a){
            this.foo = a.foo;
        }
    }
    

    【讨论】:

    • foo 是一个 int 并且不会被引用,它将被复制到一个新的 foo 中。
    • 有一个简单的解决方法 - 使用 Integer 包装类而不是 int
    • @Shmoo:听起来您基本上想将 B 类的某些功能与 A 类的特定实例一起使用。好吧,您不能那样做,期间。如果你愿意的话,我怀疑你的设计有问题。
    【解决方案3】:

    你不能简单地这样做,因为变量a 的运行时类型无论如何都会是A,而不是B

    这意味着a 将不具备B 的特性.. 并且您无法通过强制转换获得它!

    【讨论】:

      猜你喜欢
      • 2013-09-19
      • 1970-01-01
      • 2017-12-30
      • 2020-10-05
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2017-03-26
      相关资源
      最近更新 更多