我正在学习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
在括号内,再一次如何将方法附加到此?
答案 0 :(得分:1)
context
的编译类型类型为ApplicationContext
。假设context
的运行时类型为ClassPathXmlApplicationContext
,为了调用ClassPathXmlApplicationContext
的方法,您必须将context
投射到ClassPathXmlApplicationContext
。
((ClassPathXmlApplicationContext) context).close();
是一种较短的写作方式:
ClassPathXmlApplicationContext cpcontext = (ClassPathXmlApplicationContext) context;
cpcontext.close();
没有括号,编译器会检查编译时类型context
(即ApplicationContext
)是否具有close()
方法。如果没有,则代码不会通过编译。
使用括号,编译器会检查ClassPathXmlApplicationContext
是否有close()
方法。
答案 1 :(得分:0)
事情是:表达“从右到左”起作用。
所以,当你有
时Foo foo = ...
(X) foo.bar();
编译器假定foo必须是一个具有bar()方法的类,该方法返回一些东西;并且返回的值应该转换为X.
但是你想把foo转换为X,因为bar()存在于X上而不是foo上。
答案 2 :(得分:0)