Java getContentPane()需要强制转换
我创建了一个扩展JFrame的类,默认情况下,它将创建一个JPanel。我试过这个: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;
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,但这并不能保证,所以你不应该盲目地使用它。你可以看看下面我的解决方案。你可以看看下面我的解决方案。