班级出错了吗?

时间:2013-10-25 21:55:49

标签: java reflection

好的。我正在为我的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

我做错了什么? (并注意在这种情况下我不能使用通过括号的正常铸造)

2 个答案:

答案 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。