【问题标题】:Identical classes casting?相同的班级铸造?
【发布时间】:2011-04-23 07:44:52
【问题描述】:

假设我有两个类 A 和 B。两者都是相同的(相同的属性、方法等),但它们的名称不同。

在 Java 中有一些安全的方法可以将 B 对象转换为 A 对象吗?

【问题讨论】:

  • 不。为什么你还想要? (除非您的意思是让一个扩展另一个,或者让它们都实现一个通用接口。)

标签: java class casting


【解决方案1】:

不,如果它们属于不同的类层次结构,则不能将它们转换为另一个。它们不相同,即使它们碰巧共享相同的属性和方法。此外,如果它们属于同一个类层次结构,其中一个不是另一个的超类,您也不能跨同一个类层次结构进行强制转换。层次结构中只有向上转换和向下转换。

但是,如果

  • 它们实现相同的接口,或扩展相同的超类,并且
  • 该方法接受接口类型或超类类型的参数

(这是polymorphism的基本前提。)

【讨论】:

  • 不是多态的基本前提,是java的东西。 A 和 B 都是彼此的子类型,在它们之间进行转换是无痛的。
  • @double_squeeze 哪里说 A 和 B 是彼此的子类型?
  • @Sentry 它们是相等的,因此它们是彼此的子类型。
  • @double_squeeze 不,它们可能相等,但不相同。因此,彼此之间没有子类型。正如答案所说,如果它们属于不同的类层次结构,它们就不相同。
  • @Sentry 它们是相等且相同的。 java不承认它的事实是另一个问题。在许多具有不错编译器的语言中,这些类是可以互换的。 Java 无法决定,但它们仍然是彼此的子类型。实际上,即使在 Java 中,它们也是彼此的子类型:如果您使用 A 类型元素的工作代码,并将其替换为 B 类型元素,以及所有类型注释,它仍然可以工作。跨度>
【解决方案2】:

不,你不能,除非它们有一个具有相同属性的共同父级,但你可以使用 common.beanutils 中的 copyProperties() 方法将每个属性从一个 bean 传递到另一个。

另一种方法是为 A 创建一个子类,该子类可以将调用委托给 B,反之亦然。

第三种方法是使用proxy

但最后两种解决方案仅适用于方法调用,如果您的属性是公开的,您将无能为力。

【讨论】:

    【解决方案3】:

    也许,您可以使用反射来复制属性。 然后,创建一个包装函数来“转换”类;示例:

    class A {
        public cc=0;
    }
    class B {
        public cc=2;
    }
    
    B mycast(A a){
        B b=new B();
    
        for(String name in a)
            b.setProperty(name,a.getProperty(name));
    
        return b;
    }
    

    注意事项:

    • 我已经有一段时间没有使用 Java 了,所以以上内容或多或少应该被视为伪代码,尤其是 JS 风格的反射。
    • 我建议你改用接口;它们是专门为满足您的需求而设计的(当然还有更多)。

    【讨论】:

      【解决方案4】:

      正式地说,两个 Java 类可以相同的唯一方法是它们满足恒等式 a == b。根据定义,具有相同成员和不同名称或包的两个类不会这样做。

      【讨论】:

        【解决方案5】:

        唯一的办法就是手动将A类的数据设置为B类的数据

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多