假设我们有obj
类型的对象Object
,System.out.println(obj)
生成{a=Some text, b=Some more text, c=Even more text}
。
现在我们想要创建一个仅obj2
的新对象{a=Some text}
(即b
和c
字段从obj
修剪。所以我们定义一个类A
如下:
class A {
String a;
}
然后我们按如下方式初始化obj2
:
A obj2 = (A) obj
。
不幸的是,我在执行此操作时遇到了运行时错误。
问题:我们如何定义obj2
如上所述?
答案 0 :(得分:1)
您获得例外的原因是obj
仅属于Object
类型;你不能神奇地"将其转换为A
,使其适合obj2
。在Java中,您只能将Object强制转换为已经的类型;你不能做出不属于A
和A
的事情。相反,您必须手动复制属性,即将obj2.a
设置为obj.a
。
分配obj2.a = obj.a
的另一种方法是同时生成obj
类型的obj2
和A
,其中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 仍有属性b
和c
;他们只是无法进入。
答案 1 :(得分:0)
在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
的定义,那么您可以extend
从课程B
{class} A
。然后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=" + b.a + "}";
}
}
然后你必须创建A a = new A(obj);
。你不能这样做。但是如果你打印a
,你将获得所需的输出。
希望这可能会有所帮助!!
答案 2 :(得分:0)
假设您在f1,f2,f3
class A
使用字段class B
f1
在class A
中声明一个像这样的方法
public B getTrimmedObject()
从A中设置B的必填字段。
e.g。 设置f1并返回B Object
Other way : use composition over inheritance
。B将成为A的成员,您只需从A. In this case split fields between A and B and avoid duplication
获得B.
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