据我所知,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
}
}
答案 0 :(得分:3)
以下行可以简化
Object ob=(Question)s.clone();//no compile time error
// the cast is unnecessary:
Object ob= s.clone();
但就像你说的那样,ob
仍会包含Question
个对象。问题是,一旦你开始使用这个ob
引用,java就知道它包含值Object
或它的子类。因此对于java ob
可以是Number
或String
或Airplane
。
Object ob = "airplane";
一旦到达ob.call()
行,它就会拒绝。因为它不确定ob
对象是否有call
方法。例如,如果它是String
或Number
则不可能。
出于这个原因你必须首先执行一个简单的演员:
((Question)ob).call();
// or
((Sample)ob).call();
让java知道它是一个带调用方法的对象。
地图#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
而clone
方法标记为Question
和Sample
{1}}类为public
。
所以简而言之Object#clone
是无法访问的; <{1}}和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;