Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 相同等级的演员?_Java_Class_Casting - Fatal编程技术网

Java 相同等级的演员?

Java 相同等级的演员?,java,class,casting,Java,Class,Casting,假设我有两个类A和B。它们都是相同的(相同的属性、方法等),但它们的名称不同 在Java中,有某种安全的方法可以将B对象强制转换为a对象?不,如果它们属于不同的类层次结构,则不能将一个对象强制转换为另一个对象。它们不完全相同,即使它们碰巧共享相同的属性和方法。此外,如果它们属于同一类层次结构,但其中一个不是另一个的超类,则也不能跨同一类层次结构强制转换。在一个层次结构中只有向上和向下转换 但是,如果需要,可以将任一类的对象传递给某个方法 它们实现相同的接口,或扩展相同的超类,以及 该方法接受接

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


在Java中,有某种安全的方法可以将B对象强制转换为a对象?

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

但是,如果需要,可以将任一类的对象传递给某个方法

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

(这是的基本前提。)

不可以,除非它们有一个具有相同属性的公共父级,但是可以使用方法from将每个属性从一个bean传递到另一个bean

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

第三种方法是使用


但最后两种解决方案仅适用于方法调用,如果属性是公共的,则无法执行任何操作。

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

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风格的反射
  • 我建议你改用界面;它们是专门为做你想做的(当然还有更多)

从形式上讲,两个Java类可以完全相同的唯一方法是满足标识a==b。根据定义,两个具有相同成员和不同名称或包的类不会这样做。

唯一的方法是手动将类A中的数据设置为类B中的数据。你为什么要这么做?(除非你想让其中一个扩展另一个,或者让它们都实现一个公共接口。)这不是多态性的基本前提,而是java的东西。A和B都是彼此的子类型,它们之间的铸造是无痛的。@double_Squence哪里说A和B是彼此的子类型?@Sentry它们是相等的,因此它们是彼此的子类型。@double_Squence不,它们可能相等,但不相同。因此,不存在彼此的子类型。正如答案所说,如果它们属于不同的阶级等级,它们就不完全相同。@Sentry它们是平等的、完全相同的。java无法识别这一事实是另一个问题。在许多具有良好编译器的语言中,这些类是可互换的。Java无法决定这一点,但它们仍然是彼此的子类型。实际上,即使在Java中,它们也是彼此的子类型:如果使用类型为A的元素替换工作代码,使用类型为B的元素替换它,使用所有类型注释,它仍然可以工作。