如何在Java中修剪其某些字段的对象?

假设我们有一个Object类型的对象obj ,使System.out.println(obj)生成{a=Some text, b=Some more text, c=Even more text}

现在我们想要创建一个新对象obj2 ,它只是{a=Some text} (即,字段bc是从obj中删除的)。 所以我们定义一个类A如下:

 class A { String a; } 

然后我们按如下方式初始化obj2

A obj2 = (A) obj

不幸的是,这样做时出现运行时错误。

问题:我们如何定义上面概述的obj2

假设您在class A有三个字段f1,f2,f3

使用字段f1创建新的class B

像这样在class A类中声明一个方法

 public B getTrimmedObject() 

从A设置B的必填字段。

例如, 设置f1并返回B对象

Other way : use composition over inheritance .B将成为A的成员,你可以简单地从A获得B. In this case split fields between A and B and avoid duplication

f1将是B和B的一部分,f2,f3将成为A的一部分。构造函数将通过B和f2设置f1值,f3通过正常初始化设置

编辑:示例代码:

 public class A{ private B b; private String f2; private String f3; public A(String f1,String f2,String f3){ b = new B(f1); this.f2 = f2; this.f3 = f3; System.out.println("In A->B:"+getB().getF1()+":A:f2:"+f2+":A:f3:"+f3); } public B getB(){ return this.b; } public static void main(String args[]){ if (args.length < 3) { System.out.println("Usage: java A str1 str2 str3"); return; } A a = new A(args[0],args[1],args[2]); } } class B{ private String f1; public B(String f1){ this.f1 = f1; } public String getF1(){ return this.f1; } } java A apple banana camel In A->B:apple:A:f2:banana:A:f3:camel 

您获得exception的原因是因为obj只是Object类型; 你不能“神奇地”把它变成A所以它适合obj2 。 在Java中,您只能将Object转换为它已经存在的类型; 你不能做一些不是AA 。 相反,您必须手动复制属性, obj2.a obj.a设置为obj.a

分配obj2.a = obj.a一种替代方法是使objobj2A ,其中obj也是更具体的类型B 例如,假设您要按如下方式定义A类:

 public class A { public String a = "Some text"; } 

然后,您可以将B定义为:

 public class B extends A { public String b = "Some more text"; public String c = "Even more text"; } 

最后,您可以这样创建对象:

 B obj = new B(); A obj2 = obj; System.out.println(obj2.a); // Prints "Some text" System.out.println(obj2.b); // Throws an error 

请注意,在第二种方法中,obj2 仍然具有属性bc ; 他们只是无法访问。

在java中,每个对象都是一个Object 。 因此obj必须是一个Object 。 但这并不意味着obj只是一个Object 。 当然,如果你得到System.out.println(obj)一些可读结果,那么obj从另一个类扩展。

它不是类型A因为A a = (A)obj给出错误。 您可以使用以下命令查看obj的类名:

 System.out.println(obj.getClass().getName()); 

我们假设obj来自B类。 有一些事情要做你想做的事情。

如果您可以更改B的定义,那么您可以从Aextend B类。 然后A a = (A)obj; 将工作。

 class B extends A{ ... } 

但是,如果你打印a你将无法获得所需的输出。

您可以更改A类。

 class A{ private B b; public A(B b){ this.b = b; } @Override public String toString() { return "{a=" + ba + "}"; } } 

然后你必须创建A a = new A(obj); 。 你不能投这个。 但是如果你打印a你将得到你想要的输出。

希望这可能会有所帮助!!