2016-08-25 6 views
-2

私は、私は型キャストがどのように動作するか理解していない、次のコードを持って、途中でJavaと春を学んでいます:奇妙な型キャスト((ClassPathXmlApplicationContext)context).close();

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はなぜかっこ内に追加できますか?

+1

関連リンクを参照してください 'この領域のcontext'は、実際には' ApplicationContext'ので、あなたは 'context.close(言う)である;'鋳造せずに、エラーが発生します。あなたが言ったように、 '(ClassPathXmlApplicationContext)context.close();'のように括弧で囲まずにキャストすると、 'context.close()'の結果を 'ClassPathXmlApplicationContext'にキャストします。代わりに、 'context'オブジェクトだけを' ClassPathXmlApplicationContext'にキャストしたいのですが、 '((ClassPathXmlApplicationContext)context).close();'の括弧で囲まれている理由 – Orin

+0

ここでの混乱は何か分かりません。括弧内の式が最初に評価されるので、このコードが最初にキャストされ、キャストされたオブジェクトに対して 'close'が呼び出されます。他のコードは 'close'を最初に呼び出してから、結果をキャストしようとします。 '(1 + 2)* 3'のような単純な数学と変わらない。 – Tom

答えて

1

contextのコンパイルタイプタイプはApplicationContextです。 contextの実行時のタイプがClassPathXmlApplicationContextであると仮定すると、ClassPathXmlApplicationContextのメソッドを呼び出すには、contextClassPathXmlApplicationContextにキャストする必要があります。

((ClassPathXmlApplicationContext) context).close(); 

書き込みの短い方法である:括弧なしの

ClassPathXmlApplicationContext cpcontext = (ClassPathXmlApplicationContext) context; 
cpcontext.close(); 

、コンパイラチェックcontextのコンパイル時の型(すなわち、ApplicationContext)はclose()メソッドを持っているかどうか。そうでなければ、コードはコンパイルをパスしません。

をかっこで囲むと、ClassPathXmlApplicationContextclose()メソッドがあるかどうかがチェックされます。

0

事実は、右から左への表現「働く」です。だから、

あなたは

Foo foo = ... 
(X) foo.bar(); 

を持っている場合、コンパイラはfooが何かを返しバー()メソッドを持つクラスのものでなければならないことを想定しています。返された値はXにキャストされます。

しかし、bar()はfooではなくX上に存在するため、fooをXにキャストしたいとします。

0

あなたはJavaで演算子の優先順位を習得する必要があります場合は (ClassPathXmlApplicationContext) context.close();それは最初contecxt.close()を実行し、その後ClassPathXmlApplicationContextに結果をキャストしようとします。 close()メソッドは何も返さないため、これは不正な型変換です。
((ClassPathXmlApplicationContext) context).close();で、まずコンテキストをClassPathXmlApplicationContextと入力してから、結果に対してclose()を実行するように指示します。

herehere

関連する問題