为什么这种方法需要铸造?

时间:2014-01-28 15:40:28

标签: java casting

我一直在为一个学校项目用Java编写一个非常基本的音乐播放器,我想通过实现一个音量滑块来增加一些声音。基本上,我一步一步地阅读如何做,它确实有效,但有一个我坦率地不理解的元素,那就是

(JSlider)event.getSource(); 

方法。我不明白的是什么似乎是铸造。为什么我需要将event.getSource()强制转换为JSlider?我怎么可能,因为ChangeEvent和JSlider没有(至少我的理解)子类/超类关系?

以下是完整的方法:

public void stateChanged(ChangeEvent event)
    {
        JSlider source = (JSlider)event.getSource();

        int volume = source.getValue();

        setVolume(volume);
    }

5 个答案:

答案 0 :(得分:4)

方法签名是

  

public Object getSource()

由于它返回Object,因此必须将其转换为JSlider以将其分配给JSlider变量。一切都是对象的子类型;编译器不知道返回的Object是JSlider。

答案 1 :(得分:3)

您不会投射event本身,而是投射嵌套的source

在您的情况下,您将获得source via:

event.getSource();

你投了它,显然是因为它的类型可以转换为JSlidergetSouce()方法合同表示它返回一个Object实例,因此在运行时转换它将通过,或者将失败,您将收到ClassCastException

答案 2 :(得分:1)

事件对象包含对生成事件的组件的引用。要从事件对象中提取该引用,请使用:

Object getSource()

由于getSource()的返回类型是Object(类层次结构最顶层的类),因此使用类型转换:

// listener method
public void stateChanged( ChangeEvent evt )
{
  JSlider source;

  source = (JSlider)evt.getSource();
  . . . .
}

现在你有一个引用事件的滑块的引用,你可以使用任何滑块的方法。

答案 3 :(得分:0)

ChangeEvent包含对源对象的引用(可以是抛出ChangeEvent的任何内容)。在这种情况下,您知道它是一个JSlider,因此您可以将事件源转换为JSlider。

答案 4 :(得分:0)

这是因为可以从各种来源(Swing组件)生成事件。

由于是这种情况,您需要转换为适当的类型。

如果您没有投射到JSlider,则无法使用getValue()方法。