如何将对象克隆到对象 class 的对象?

How to clone a object to a object of Object class?

据我了解,Object class 是顶级 class,它是所有 class 的父级。如果我们在编译时不知道 class 的类型,我们可以将它赋值给 Object class.

的对象

我正在尝试 clone 对象到 Object class 的对象。还试图从已经实例化的 HashMap 获取对象。我在做这件事时遇到了问题。你能弄清楚并解释正确的做法吗?我已经评论了在哪些行中出现编译时错误。我的主要疑惑是:

代码:

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 可能是 NumberStringAirplane.

Object ob = "airplane";

一旦到达第 ob.call() 行,它就会拒绝。因为不确定 ob 对象是否有 call 方法。例如,如果它是 StringNumber,那将是不可能的。

因此你必须先进行简单的转换:

((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 方法,但它被标记为 protectedclone 方法在你的 QuestionSample class是public。 所以简而言之 Object#clone 是不可访问的; Sample#cloneQuestion#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();