Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 奇怪的类型转换((ClassPathXmlApplicationContext)上下文).close();_Java - Fatal编程技术网

Java 奇怪的类型转换((ClassPathXmlApplicationContext)上下文).close();

Java 奇怪的类型转换((ClassPathXmlApplicationContext)上下文).close();,java,Java,我正在学习java和spring,我有以下代码,我不了解类型转换是如何工作的: public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("com/voja/spring/test/beans/beans.xml"); ((ClassPathXmlApplicat

我正在学习java和spring,我有以下代码,我不了解类型转换是如何工作的:

public class App {

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("com/voja/spring/test/beans/beans.xml");

        ((ClassPathXmlApplicationContext) context).close();

    }

}
因此,以下是:

((ClassPathXmlApplicationContext) context).close();
这是我不明白的

我的想法应该是:

(ClassPathXmlApplicationContext) context.close();
但这是一个错误


它现在的样子是它应该是什么样子的,但我不知道该方法是如何在它上面调用的,为什么
(ClassPathXmlApplicationContext)context
在括号中,并且再一次说明如何将一个方法附加到它上面?

context
的编译类型是
ApplicationContext
。假设
context
的运行时类型为
ClassPathXmlApplicationContext
,为了调用
ClassPathXmlApplicationContext
的方法,必须将
context
强制转换为
ClassPathXmlApplicationContext

((ClassPathXmlApplicationContext) context).close();
是一种较短的书写方式:

ClassPathXmlApplicationContext cpcontext = (ClassPathXmlApplicationContext) context;
cpcontext.close();
如果没有括号,编译器将检查
context
(即
ApplicationContext
)的编译时类型是否具有
close()
方法。如果没有,代码就无法通过编译

使用括号,编译器检查
ClassPathXmlApplicationContext
是否有
close()
方法。

问题是:表达式“从右到左工作”

所以,当你

Foo foo = ...
(X) foo.bar();
编译器假定foo必须属于一个类,该类具有返回某些内容的bar()方法;该返回值应转换为X


但是您希望将foo强制转换为X,因为bar()存在于X上,而不是foo上。

您需要了解Java中的运算符优先级: 在case
(ClassPathXmlApplicationContext)context.close()中它将首先执行
contecxt.close()
,然后尝试将其结果强制转换为ClassPathXmlApplicationContext。这是非法的强制转换,因为close()方法不返回任何内容
使用
((ClassPathXmlApplicationContext)上下文)。关闭()告诉您首先将上下文强制转换为键入ClassPathXmlApplicationContext,然后对结果执行close()


请参阅相关链接或此区域中的上下文实际上是一个
ApplicationContext
,因此当您说
context.close()时如果不强制转换,则会出现错误。如果您按照您所说的操作并强制转换它,而不将其括在括号中,例如
(ClassPathXmlApplicationContext)context.close()
,您正在将
context.close()
的结果强制转换为
ClassPathXmlApplicationContext
。相反,您只想将
上下文
对象强制转换为
类路径XMLApplicationContext
,因此它被括在
((类路径XMLApplicationContext)上下文)的括号中我不明白这里的困惑是什么。括号中的表达式首先求值,因此此代码首先强制转换,然后对强制转换的对象调用
close
。另一个代码尝试先调用
close
,然后强制转换结果。它和简单的数学没有什么不同,比如
(1+2)*3