奇怪的类型转换((ClassPathXmlApplicationContext)context).close();

时间:2016-08-25 12:59:51

标签: java

我正在学习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在括号内,再一次如何将方法附加到此?

3 个答案:

答案 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)

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

请参阅相关链接herehere