好的。我正在为我的java程序做一些反思,但是我被困在一个看起来很简单但只是不起作用的部分。
这是我试图做的事情:
Thread t = new Thread();
System.out.println("Casting "+Thread.class.getName()+" to "+Runnable.class.getName());
Object newThread = Runnable.class.cast(t);
System.out.println("New class: "+newThread.getClass().getName());
预期的产出是
但是,New class: java.lang.Runnable
会返回New class: java.lang.Thread
。
我做错了什么? (并注意在这种情况下我不能使用通过括号的正常铸造)
答案 0 :(得分:4)
您必须了解对象引用类型的转换。与普通转换一样,Class
's cast
method不会更改对象的实际类型。它产生一个引用该对象的适当类型的引用变量,该变量不会被更改。
Thread
t
仍然是Thread
。演员实际上是有效的,因为Thread
implements Runnable
,否则会抛出ClassCastException
。但它仍然是Thread
。
答案 1 :(得分:1)
这是Thread类的定义方式:
public class Thread
extends Object
implements Runnable
因此,即使将其转换为Runnable,作为Thread类实例的对象仍会将其类名返回为Thread。