2014-03-25 73 views
0

如果我有两个相关的类AB这样class B extends A然后创建一个B的实例,是否有任何方法可以完全上传它,使它现在是一个有效的实例AJava中是否有可能将对象完全转换为其基类型?

B b = new B(); 
A a = full_upcast_to_A(b); 
a.class.equals(A.class) 

这是最后一行很重要。我不想通过A变量引用B对象。它希望引用的A对象的外观和行为就像使用new A()创建的一样。

如果我执行标准A a = (A) b;,则该对象仍在内部为B类型,如果您查看.class或调用任何重写的方法。我不想那样。

A 拷贝基本类A成为新的A对象是可以接受的,但不是优选的。

更新:为什么它:

这是一个复杂的局面。我有一个POJO数据类(A),它是通用代码,但我无法从数据存储加载它,因为这些需要一个@Entity注释,所以我有一个派生类(B),该类除了注释之外什么也不添加,因此允许存储。但是,我需要通过GWT RPC返回A,因为客户端不知道B。 GWT拒绝这样做,因为它只知道如何序列化A及其接收B

B未包含在可由此SerializationPolicy序列化的类型集中,或者其Class对象无法加载。为了安全起见,这种类型不会被序列化。

+8

简答题:没有。长答案:没有哦。复制是唯一的选择。 –

+1

这会完全破坏重写方法的功能,并且可能会使对象处于不一致的状态,而不会造成错误。例如。 '''toString()''* always *调用类层次结构中最“近”的实现。 –

+1

没有,而且需要这样做,甚至从B创建一个新的A,这表明一个设计缺陷。 B是一个A,根据定义,意味着A不是B.稍微多一些信息可能会导致更好的解决方案。为什么是主要问题。 –

回答

0

我认为你所寻找的不是直接可能的。

我会完成同样的方法是使用拷贝构造函数模式,比如:

public class A { 
    public A(A copy) { 
     // Copy the relevant state into new A instance here. 
    } 
} 

你会再这样使用:

B b = new B(); 
A a = new A(b); 

编辑:

托尼霍普金森是对的,但我不确定你为什么想这样做。

+0

A可以只有'公共A(副本){...}'。它不需要知道关于B的任何内容。我也认为我可以在'A'上实现'clone()',但是因为我想'A'只是字段而没有方法(或者至少没有复杂的方法,并且clone()很复杂),我在回避它。 –

+0

你当然是对的。我已经更新了我的答案以反映这一点。我有一些GWT和JPA的经验,我很好奇它为什么会拒绝序列化B.如果唯一的变化是一个额外的注释,我不明白为什么它不会工作。我已经有过@Entity注释过的类可以被GWT序列化。你能否给我们更多关于你在尝试在GWT RPC中使用B的原因或错误的细节? – DavidH

+0

复制文件是否比静态复制(A)方法更好,然后复制新文件然后复制字段?我相信GWT只是看'.class'来验证它与它所知道的类型,可能是因为你不会意外发送太多。我会将错误消息添加到问题中。 –

0

好的,我想我理解这里的根本问题。我不确定你使用的是什么JPA提供程序,但是我在Hibernate中遇到了同样的问题,可能和你现在遇到的问题一样。

GWT是一个聪明的框架。只要你试图序列化实现可序列化,并且它的所有成员都是可序列化的,它就应该能够将对象发送到客户端。访问数据库时,某些JPA提供程序会做什么?它们是否提供了一些巧妙的缓存,仅用于加载数据和特定请求的成员。例如,Hibernate通过提供一个与您拨打电子邮件new B()时不同的对象来实现此目的。它会给你一个具有B接口的对象,但在后台使用代理来调用getter方法时从数据库获取数据。它将用类似PersistentBag的类替换标准java列表,当你访问它们时,它们也会使用代理到数据库。

当您尝试将此代理对象发送给客户端时,GWT会查看所有这些不可序列化的代理并拒绝它们,因为它应该如此。客户端无法直接访问数据库。您可以通过查看调试器中的代码并查看运行时对象的属性,来测试是否发生了这种情况。无论如何,我解决这个问题的方式是使用Dozer,一个设计用来采用一种形式的类并将其映射到另一个类的库。您也可以使用复制构造函数。您甚至不需要将B转换为A.您可以使用new B(b),只要您需要的所有字段都被复制,数据库访问已经发生,并且您有一个GWT可以理解的B实例。

欲了解更多信息,请参阅GWT Project Homepage: Hibernate。特别是关于“为什么Hibernate对象在到达浏览器世界时无法理解”的部分。

相关问题