Java 奇怪的类型转换((ClassPathXmlApplicationContext)上下文).close();
我正在学习java和spring,我有以下代码,我不了解类型转换是如何工作的: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
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
。