我正在从头开始学习Java(慢慢地),但是我不时地在一些“真正的”代码中达到顶峰,我发现了让我困惑的东西。
以下行和类似的行:
JPanel panel = (JPanel) container.getContentPane();
我的问题是(JPanel)
和container.getContentPane()
之间发生了什么?它不像它们正在成倍增加吗?
我知道这是语言的一个基本部分,随着我继续学习,我会接触到这一部分,但我非常好奇,想知道它是什么。我真的不知道该怎么去谷歌才能得到答案。
答案 0 :(得分:4)
它们不是正好倍增吗?
没有。这意味着“得到这个东西并将其视为JPanel”。它被称为类型转换,该语法用于C ++,C#和许多其他语言。
您必须确保类彼此相关的方式允许进行转换。例如,这不起作用:
JPanel p = new JPanel();
JComponent c = (JComponent)p;
JButton b = (JButton)c;
JPanel
是JComponent
,JButton
也是JButton
,但JPanel
不会从JSpinner.DefaultEditor
下降,因此您无法在这些对象之间进行转换。您还可以将孩子从孩子转投回父母,例如从JPanel
投放回JPanel
,但不能从JSpinner.DefaultEditor
投放到{{1}}。
答案 1 :(得分:1)
这是一个演员表达(见JLS 15.16, Cast Expressions)。
这意味着“将getContentPane()
来电的结果视为JPanel
”。
施法可能会失败,导致ClassCastException
(请参阅JLS 5.5, Casting Conversion)。
答案 2 :(得分:1)
这称为类型转换。方法getContentPane()
通常返回一个Container,但是我们希望在JPanel中获取它,这样我们就可以使用JPanel方法了。当然这两种类型必须兼容(例如,JPanel是Container的一个特定实现(通过JComponent))
答案 3 :(得分:0)
是的,这是在java中进行类型转换的方式。如您所知,java可以使用引用。在你的情况下你有一个JPanel类型引用和container.getContentPane()返回(纠正我,如果我错了我的Swing有点生锈)容器,所以既然这两个是不兼容的,你需要键入强制转换,使它们兼容。希望有所帮助