【问题标题】:Why is it possible to typecast JFrame into a JPanel?为什么可以将 JFrame 类型转换为 JPanel?
【发布时间】:2012-12-30 05:20:23
【问题描述】:

这是一个例子:

// set up frame, panel
JFrame container = new JFrame("Game Example");
panel = (JPanel)container.getContentPane();

我检查了 Java API 并且两个类都实现了相同的接口,所以这和多态性是原因吗?

还是因为这两个类都是通过继承从Component类继承而来的?

【问题讨论】:

    标签: java inheritance interface casting polymorphism


    【解决方案1】:

    语法隐含的优先级是:

    panel = (JPanel)(container.getContentPane());
    

    不是

    panel = ((JPanel)container).getContentPane();
    

    注意除了扩展Component 之外,显然,扩展Object

    【讨论】:

    • 是的,我注意到了继承。感谢您提供的辅助信息,汤姆。但没有完全回答这个问题。 =]
    【解决方案2】:

    就是contentPane通常一个JPanel。打印出对象的类名,自己看看。

    System.out.println(container.getContentPane().getClass().getName());
    

    请注意,您实际上 不是“将 JFrame 类型转换为 JPanel”。 JFrame 的 contentPane 不是 JFrame 本身,也不是。

    【讨论】:

    • 我不认为这是混乱的根源。
    • 那么默认情况下您的内容窗格是 JPanel 吗?我也打印出来了,但为什么要输入 JPanel?跟多态还是继承有关系吗?
    • @Nicholas JFrame.getContentPane 的 [静态] 返回类型是 Container。这就是混乱吗?
    • @TomHawtin-tackline 混淆是为什么 container.getContentPane 在类型转换为 JPanel 之前来自 JPanel 类。既然它来自 JPanel 类,为什么即使它已经来自 JPanel 类,也要将其类型转换为 JPanel?
    • @HovercraftFullOfEels 我明白了,谢谢汤姆和气垫船!
    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 2011-01-30
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多