为什么这个方法需要强制类型转换?

4

我正在为学校项目使用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);
    }

请查看此答案:https://dev59.com/d2HVa4cB1Zd3GeqPqtix希望对您有所帮助! - rodrigopdl.89
5个回答

4

方法签名为

public Object getSource()

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


3

您不需要转换事件(event)本身,只需转换嵌套的源(source)即可。

在您的情况下,您可以通过以下方式获取源(source)

event.getSource();

你对它进行了转换,显然是因为它可以转换为 JSlider 类型。 getSouce() 方法协定表明它返回一个 Object 实例,因此在运行时进行强制转换时,要么成功,要么失败,并且你将收到一个 ClassCastException


1

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

Object getSource()

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

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

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

现在您有一个引用到导致事件的滑块,您可以使用该滑块的任何方法。

0

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


0

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

既然如此,您需要转换为适当的类型。

如果您没有转换为JSlider,则无法使用getValue()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接