Java 为什么这种方法需要浇铸?

Java 为什么这种方法需要浇铸?,java,casting,Java,Casting,我一直在为一个学校项目用Java编写一个非常基本的MusicLayer,我想通过实现一个音量滑块来添加一点sazz。基本上,我一步一步地阅读如何做,它确实起作用,但有一个因素我坦白地说不明白,那就是 (JSlider)event.getSource(); 方法。我不明白的是什么似乎是铸造。为什么我需要将event.getSource()强制转换为JSlider?既然ChangeEvent和JSlider没有(至少据我所知)子类/超类关系,我怎么能这样做呢 以下是完整的方法: public v

我一直在为一个学校项目用Java编写一个非常基本的MusicLayer,我想通过实现一个音量滑块来添加一点sazz。基本上,我一步一步地阅读如何做,它确实起作用,但有一个因素我坦白地说不明白,那就是

(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();
  . . . .
}
现在,您有了一个导致事件的滑块的引用,您可以使用该滑块的任何方法。

查看以下答案:希望有帮助!