2010-10-09 57 views
3

假设我有两个类A和B.两者是相同的(相同的属性,方法等),但它们的命名不同。相同的类铸造?

Java中有一些安全的方法将B对象作为A对象进行投射?

+3

不可以。为什么你想要呢? (除非你的意思是一个扩展另一个,或者让它们都实现一个通用接口。) – 2010-10-09 22:20:21

+1

+1为通用接口 – dsolimano 2010-10-09 22:30:16

回答

7

不,如果它们属于不同的类层次结构,则不能将其转换为另一个。他们是不一样,即使他们发生共享相同的属性和方法。此外,如果它们属于相同的类层次结构,那么但是不是另一个的超类,也不能跨同一类层次结构进行投射。在层次结构中只有向上转换和向下转换。

但是,您可以通过两种类的对象一定的方法,如果

  • 他们实现相同的接口,或扩展同超,和
  • 该方法接受一个参数就是接口的或超类的类型

(这就是的polymorphism的基本前提。)

+0

这不是多态的基本前提,它是一个java事物。 A和B是彼此的子类型,它们之间的铸造是无痛的。 – 2015-06-22 15:54:25

+0

@double_squeeze它在哪里说A和B是彼此的子类型? – Sentry 2017-09-12 22:37:36

+0

@Sentry他们是平等的,因此他们是彼此的子类型。 – 2018-01-05 16:37:11

3

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

另一种方法是创建一个A的子类,它可以将调用委托给B,反之亦然。第三种方式是使用proxy

但最后两个解决方案只适用于方法调用,如果你的属性是公开的,你什么都不能做。

1

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

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风格的体现。
  • 我建议你改用一个接口;他们是专门做你想做的事情(当然还有更多)。
0

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

0

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