Java getContentPane()需要强制转换

Java getContentPane()需要强制转换,java,swing,Java,Swing,我创建了一个扩展JFrame的类,默认情况下,它将创建一个JPanel。我试过这个: public class Main extends JFrame { JPanel pane; private static final long serialVersionUID = 1L; public Main() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); int WIDTH = 500, HEIGHT = 500;

我创建了一个扩展JFrame的类,默认情况下,它将创建一个JPanel。我试过这个:

public class Main extends JFrame {

JPanel pane;

private static final long serialVersionUID = 1L;

public Main() {

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    int WIDTH = 500, HEIGHT = 500;
    setBackground(Color.LIGHT_GRAY);
    setSize(WIDTH, HEIGHT);
    setTitle("Window");
    setLocationRelativeTo(null);

    pane = getContentPane();
}
我正在使用Eclipse,它给出了一个错误,建议我使用getContentPaneto返回一个JPanel,但据我所知,这是它应该返回的内容。我插入了System.out.printlGetContentPane;它在控制台中说它返回了一个JPanel,所以我有点不明白为什么它需要被转换。这里有我遗漏的东西吗?谢谢。

容器是JPanel继承层次结构中的父级

getContentPane返回一个容器,在本例中,它是一个JPanel对象。因此,需要强制转换才能将容器强制转换为其更具体的子类型,如下所示:

pane = (JPanel) getContentPane();
容器是JPanel继承层次结构中的父级

getContentPane返回一个容器,在本例中,它是一个JPanel对象。因此,需要强制转换才能将容器强制转换为其更具体的子类型,如下所示:

pane = (JPanel) getContentPane();
如果您阅读了,您将看到它返回一个容器实例,在您可以将其分配给JPanel变量之前,您必须强制转换它

在许多情况下,您确实应该测试返回结果是否实际上是一个实例,或者是否可以在if语句中使用instanceof分配给JPanel

如果您阅读了,您将看到它返回一个容器实例,在您可以将其分配给JPanel变量之前,您必须强制转换它

在许多情况下,您确实应该测试返回结果是否实际上是一个实例,或者是否可以在if语句中使用instanceof分配给JPanel

它给出了一个错误,建议我将getContentPaneto转换为返回一个JPanel,但据我所知,这是它应该返回的内容

您得到错误是因为您调用了:

getContentPane();
在返回类型为容器的JFrame中,您试图将容器分配到JPanel中:

如果你不明白为什么不允许这样做,想想这个

因为所有的狗都是动物,所以在代码方面,你总是可以这样做:

Animal animal = new Dog();  //Assign dog as Animal (O.K)
但是如果我有一只动物。我能说它肯定是只狗吗

Dog dog= new Animal();      //Assign animal as dog (NOT O.K)
答案是否定的,除非你明确告诉我相信我,这种动物是狗。让我将这个Dog对象指定给Dog变量

这一想法与编程中的角色转换相同:

Animal animal = new Animal();
Dog dog = (Dog)animal;     //Tell Java this animal is indeed a Dog (O.K)
现在,您使用JPanel和容器的场景是相同的


啊好的。但这很奇怪,因为我在web示例的不同代码片段中看到了它在不强制转换的情况下工作的情况。看看这个例子

给定链接中的代码之所以有效,是因为该代码仅使用getContentPane中的.add方法

注意:getContentPane返回一个容器对象

如果您看一下,.add是容器类的一个方法

因为它正在调用属于容器类的方法。它肯定会工作,不需要铸造

除非从容器的子类(如JPanel)调用方法,否则需要强制转换。比如说,

getContentPane.add(whatever);        //Casting NOT needed, add() is a method of Container
((JPanel)getContentPane()).getUI();  //Casting needed, getUI() is a method of JPanel
它给出了一个错误,建议我将getContentPaneto转换为返回一个JPanel,但据我所知,这是它应该返回的内容

您得到错误是因为您调用了:

getContentPane();
在返回类型为容器的JFrame中,您试图将容器分配到JPanel中:

如果你不明白为什么不允许这样做,想想这个

因为所有的狗都是动物,所以在代码方面,你总是可以这样做:

Animal animal = new Dog();  //Assign dog as Animal (O.K)
但是如果我有一只动物。我能说它肯定是只狗吗

Dog dog= new Animal();      //Assign animal as dog (NOT O.K)
答案是否定的,除非你明确告诉我相信我,这种动物是狗。让我将这个Dog对象指定给Dog变量

这一想法与编程中的角色转换相同:

Animal animal = new Animal();
Dog dog = (Dog)animal;     //Tell Java this animal is indeed a Dog (O.K)
现在,您使用JPanel和容器的场景是相同的


啊好的。但这很奇怪,因为我在web示例的不同代码片段中看到了它在不强制转换的情况下工作的情况。看看这个例子

给定链接中的代码之所以有效,是因为该代码仅使用getContentPane中的.add方法

注意:getContentPane返回一个容器对象

如果您看一下,.add是容器类的一个方法

因为它正在调用属于容器类的方法。它肯定会工作,不需要铸造

除非从容器的子类(如JPanel)调用方法,否则需要强制转换。比如说,

getContentPane.add(whatever);        //Casting NOT needed, add() is a method of Container
((JPanel)getContentPane()).getUI();  //Casting needed, getUI() is a method of JPanel

谢谢你的信息。但是由于JPanel是容器的子容器,这不是通过继承自动使JPanel成为容器吗?确实如此,但不一定相反,因此强制转换是必要的。所有的JPanel都是容器,但不是所有的容器都是JPanel。啊,好的。但这很奇怪,因为我在web示例的不同代码片段中看到了它在不强制转换的情况下工作的情况。看看这个例子:谢谢你的信息。但由于JPanel是一个
容器的子容器,这不是通过继承自动使JPanel成为容器吗?是的,但不一定相反,所以强制转换是必要的。所有的JPanel都是容器,但不是所有的容器都是JPanel。啊,好的。但这很奇怪,因为我在web示例的不同代码片段中看到了它在不强制转换的情况下工作的情况。看看这个例子:谢谢。在使用sysout在控制台窗口中查看结果时,它表明这是一个JPanel。那么?getContentPane告诉您它是一种容器。如果你知道它是另一种类型,你需要转换它这是多态性的一个例子,因为它的继承链,JPanel可以像容器一样工作,但容器不能像JPanelAnd另一方面,你不应该假设API可能返回什么,getContentPane保证它可以返回容器,根据经验,我知道它倾向于返回一个JPanel,但这并不能保证,所以你不应该盲目地使用它。在使用sysout在控制台窗口中查看结果时,它表明这是一个JPanel。那么?getContentPane告诉您它是一种容器。如果你知道它是另一种类型,你需要转换它这是多态性的一个例子,因为它的继承链,JPanel可以像容器一样工作,但容器不能像JPanelAnd另一方面,你不应该假设API可能返回什么,getContentPane保证它可以返回容器,根据经验,我知道它倾向于返回JPanel,但这并不能保证,所以你不应该盲目地使用它。你可以看看下面我的解决方案。你可以看看下面我的解决方案。