【问题标题】:How to clone a object to a object of Object class?如何将对象克隆为 Object 类的对象?
【发布时间】:2015-08-22 11:21:03
【问题描述】:

据我所知,Object class 是一个顶级类,它是所有类的父类。如果我们在编译时不知道类的类型,我们可以将其分配给 Object 类的对象。

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

  • 如果父类的对象可以用于克隆,那么它也必须与 Object 类一起使用,因为它是顶级类。

  • 以及如何从映射中访问对象并将其用于方法调用和克隆。

代码:

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

}
}

【问题讨论】:

  • 只是一个建议。类名的第一个字符应始终为大写(约定):即sample 应为Sample
  • @bvdb 谢谢。更新。 !
  • @RC。抱歉,我没有从其他线程中理解。如果你有时间,你能详细说明一下这个程序吗?
  • 不要对未引用的文本使用引号格式。

标签: java class object clone


【解决方案1】:

下面这行可以简化

Object ob=(Question)s.clone();//no compile time error
// the cast is unnecessary:
Object ob= s.clone();

但正如你所说,ob 仍将包含一个Question 对象。问题是一旦你开始使用这个ob 引用,java 只知道它包含Object 的值,或者它的子类。所以对于 java,ob 可以是 NumberStringAirplane

Object ob = "airplane";

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

出于这个原因你必须先执行一个简单的演员:

((Question)ob).call(); 
// or 
((Sample)ob).call();

只要让java知道它是一个带有调用方法的对象。

ma​​p#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 类确实有一个clone 方法,但它被标记为protected,而QuestionSample 类中的clone 方法是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();

【讨论】:

  • 哇,太完美了。你能解释一下如何从 HashMap 访问对象吗?
  • 对不起(问题)ob.call();也会引发编译时错误。
  • 我的立场是正确的,添加了大括号((Question)ob).call()
  • ((Question)ob).call() 运行良好。非常感谢(Y)
猜你喜欢
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2012-11-17
相关资源
最近更新 更多