Java 为什么这种方法需要浇铸?
我一直在为一个学校项目用Java编写一个非常基本的MusicLayer,我想通过实现一个音量滑块来添加一点sazz。基本上,我一步一步地阅读如何做,它确实起作用,但有一个因素我坦白地说不明白,那就是Java 为什么这种方法需要浇铸?,java,casting,Java,Casting,我一直在为一个学校项目用Java编写一个非常基本的MusicLayer,我想通过实现一个音量滑块来添加一点sazz。基本上,我一步一步地阅读如何做,它确实起作用,但有一个因素我坦白地说不明白,那就是 (JSlider)event.getSource(); 方法。我不明白的是什么似乎是铸造。为什么我需要将event.getSource()强制转换为JSlider?既然ChangeEvent和JSlider没有(至少据我所知)子类/超类关系,我怎么能这样做呢 以下是完整的方法: public v
(JSlider)event.getSource();
方法。我不明白的是什么似乎是铸造。为什么我需要将event.getSource()强制转换为JSlider?既然ChangeEvent和JSlider没有(至少据我所知)子类/超类关系,我怎么能这样做呢
以下是完整的方法:
public void stateChanged(ChangeEvent event)
{
JSlider source = (JSlider)event.getSource();
int volume = source.getValue();
setVolume(volume);
}
ChangeEvent包含对源对象(可能是引发ChangeEvent的任何对象)的引用。在本例中,您知道它是一个JSlider,因此可以将事件源强制转换为JSlider。这是因为可以从各种源(Swing组件)生成事件 由于是这种情况,您需要转换为适当的类型
如果未强制转换为JSlider,则无法使用
getValue()
方法。您不会强制转换事件本身,而是强制转换嵌套的源代码
在您的情况下,您可以通过以下方式获得源代码
:
event.getSource();
您可以强制转换它,显然是因为它的类型可以强制转换为JSlider
。方法契约表示它返回一个对象
实例,因此在运行时强制转换它将通过或失败,并且您将收到一个ClassCastException
方法签名是
公共对象getSource()
由于它返回对象,所以必须将其强制转换为JSlider以将其分配给JSlider变量。一切都是对象的一个子类型;编译器不知道返回的对象是JSlider。事件对象包含对生成事件的组件的引用。要从事件对象提取该引用,请使用:
Object getSource()
由于getSource()
的返回类型是Object
(位于类层次结构最顶端的类),因此使用类型转换:
// listener method
public void stateChanged( ChangeEvent evt )
{
JSlider source;
source = (JSlider)evt.getSource();
. . . .
}
现在,您有了一个导致事件的滑块的引用,您可以使用该滑块的任何方法。查看以下答案:希望有帮助!