如何将对象克隆到对象 class 的对象?
How to clone a object to a object of Object class?
据我了解,Object class
是顶级 class,它是所有 class 的父级。如果我们在编译时不知道 class 的类型,我们可以将它赋值给 Object class.
的对象
我正在尝试 clone
对象到 Object class
的对象。还试图从已经实例化的 HashMap
获取对象。我在做这件事时遇到了问题。你能弄清楚并解释正确的做法吗?我已经评论了在哪些行中出现编译时错误。我的主要疑惑是:
如果父对象 class' 可以用于克隆,那么它也必须与对象 class 一起使用,因为它是顶级 class。
以及如何从映射访问对象并将其用于方法调用和克隆。
代码:
import java.util.HashMap;
import java.util.Map;
class Sample {
public void call(){
}
}
class Question extends Sample implements Cloneable {
@Override
public void call(){
System.out.println("hello");
}
@Override
public Object clone()throws CloneNotSupportedException{
return super.clone();
}
public static void main(String args[]) throws CloneNotSupportedException{
Map<Character,Object> map=new HashMap();
Question s=new Question();
Sample q=new Question();
Sample cl=(Question)s.clone();
Object ob=(Question)s.clone();//no compile time error
map.put('o',s);
s.call();//hello
q.call();//hello
cl.call();/hello
ob.call();//Compile time error: cannot find symbol call
map.get('o').call();//Compile time error: cannot find symbol call
Object obj=(Question) (map.get('o')).clone();// Compile time error: clone has protected access in Object
}
}
下面一行可以简化
Object ob=(Question)s.clone();//no compile time error
// the cast is unnecessary:
Object ob= s.clone();
但正如您所说,ob
仍将包含一个 Question
对象。问题是,一旦您开始使用这个 ob
引用,java 就知道它包含一个值 Object
,或者它的子 class。因此 java ob
可能是 Number
或 String
或 Airplane
.
Object ob = "airplane";
一旦到达第 ob.call()
行,它就会拒绝。因为不确定 ob
对象是否有 call
方法。例如,如果它是 String
或 Number
,那将是不可能的。
因此你必须先进行简单的转换:
((Question)ob).call();
// or
((Sample)ob).call();
让java知道它是一个有调用方法的对象。
map#call 问题具有相同的推理:
map.get('o').call();
//could be any of these
((Sample)map.get('o')).call();
((Question)map.get('o')).call();
但最后一个问题更棘手。实际上,当您将语句拆分为多行时,很多事情都会变得清晰:
Object obj=(Question) (map.get('o')).clone();
// would be the same like writing:
Object value = map.get('o');
Object value2 = value.clone();
Object obj = (Question) value2; // The (Question) cast is actually unnecessary.
问题出在value.clone()
步。 Object
class 确实有一个 clone
方法,但它被标记为 protected
而 clone
方法在你的 Question
和 Sample
class是public
。
所以简而言之 Object#clone
是不可访问的; Sample#clone
和 Question#clone
可访问。
// so you want this:
Object value = map.get('o');
Object value2 = ((Question)value).clone(); // add a cast here
Object obj = value2;
如果您希望在 1 行中完成所有操作:
Object obj=((Question) (map.get('o'))).clone();
据我了解,Object class
是顶级 class,它是所有 class 的父级。如果我们在编译时不知道 class 的类型,我们可以将它赋值给 Object class.
我正在尝试 clone
对象到 Object class
的对象。还试图从已经实例化的 HashMap
获取对象。我在做这件事时遇到了问题。你能弄清楚并解释正确的做法吗?我已经评论了在哪些行中出现编译时错误。我的主要疑惑是:
如果父对象 class' 可以用于克隆,那么它也必须与对象 class 一起使用,因为它是顶级 class。
以及如何从映射访问对象并将其用于方法调用和克隆。
代码:
import java.util.HashMap;
import java.util.Map;
class Sample {
public void call(){
}
}
class Question extends Sample implements Cloneable {
@Override
public void call(){
System.out.println("hello");
}
@Override
public Object clone()throws CloneNotSupportedException{
return super.clone();
}
public static void main(String args[]) throws CloneNotSupportedException{
Map<Character,Object> map=new HashMap();
Question s=new Question();
Sample q=new Question();
Sample cl=(Question)s.clone();
Object ob=(Question)s.clone();//no compile time error
map.put('o',s);
s.call();//hello
q.call();//hello
cl.call();/hello
ob.call();//Compile time error: cannot find symbol call
map.get('o').call();//Compile time error: cannot find symbol call
Object obj=(Question) (map.get('o')).clone();// Compile time error: clone has protected access in Object
}
}
下面一行可以简化
Object ob=(Question)s.clone();//no compile time error
// the cast is unnecessary:
Object ob= s.clone();
但正如您所说,ob
仍将包含一个 Question
对象。问题是,一旦您开始使用这个 ob
引用,java 就知道它包含一个值 Object
,或者它的子 class。因此 java ob
可能是 Number
或 String
或 Airplane
.
Object ob = "airplane";
一旦到达第 ob.call()
行,它就会拒绝。因为不确定 ob
对象是否有 call
方法。例如,如果它是 String
或 Number
,那将是不可能的。
因此你必须先进行简单的转换:
((Question)ob).call();
// or
((Sample)ob).call();
让java知道它是一个有调用方法的对象。
map#call 问题具有相同的推理:
map.get('o').call();
//could be any of these
((Sample)map.get('o')).call();
((Question)map.get('o')).call();
但最后一个问题更棘手。实际上,当您将语句拆分为多行时,很多事情都会变得清晰:
Object obj=(Question) (map.get('o')).clone();
// would be the same like writing:
Object value = map.get('o');
Object value2 = value.clone();
Object obj = (Question) value2; // The (Question) cast is actually unnecessary.
问题出在value.clone()
步。 Object
class 确实有一个 clone
方法,但它被标记为 protected
而 clone
方法在你的 Question
和 Sample
class是public
。
所以简而言之 Object#clone
是不可访问的; Sample#clone
和 Question#clone
可访问。
// so you want this:
Object value = map.get('o');
Object value2 = ((Question)value).clone(); // add a cast here
Object obj = value2;
如果您希望在 1 行中完成所有操作:
Object obj=((Question) (map.get('o'))).clone();