3

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

我究竟做错了什么?(请注意,在这种情况下,我不能通过括号使用普通转换)

4

2 回答 2

4

您必须了解对象引用类型的强制转换是什么。像正常的强制转换一样,Class'cast方法不会改变对象的实际类型。它产生一个适当类型的引用变量,该变量引用对象,该对象没有更改。

Thread t仍然是一个Thread. 演员表实际上有效,因为ThreadimplementsRunnable,否则 aClassCastException会被抛出。但它仍然是一个Thread.

于 2013-10-25T21:58:54.230 回答
1

以下是 Thread 类的定义方式:

public class Thread
extends Object
implements Runnable

因此,作为 Thread 类实例的对象仍将其类名返回为 Thread,即使您将其强制转换为 Runnable。

于 2013-10-25T21:58:35.207 回答