2016-12-11 1 views
0
私はksoap2-アンドロイドプロジェクトを勉強しています

に関する異なる以外にオブジェクトを型キャストと私はタイプorg.ksoap2.serialization.SoapObjectのbodyOutがorg.kxml2.kdom.Nodeオブジェクトに型変換されている方法を次のコードで混乱ポイントのJava:オブジェクト

に達しましたか?両者は決して関連していません。

SoapObject soapRequest = new SoapObject() 
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope() 
envelope.setOutputSoapObject(soapRequest); 

class SoapSerializationEnvelope {}に我々が持っている:

public void setOutputSoapObject(Object soapObject) { 
    this.bodyOut = soapObject;} 

public void writeBody(XmlSerializer writer) throws IOException { 
    if (encodingStyle != null) { 
     writer.attribute(env, "encodingStyle", encodingStyle); 
    } 
((Node) this.bodyOut).write(writer);} 

と我々はNode

public class Node {} 
ある別のパッケージ内の他のクラスを持っているアプリで

は、私は次のことを宣言しました

タイプキャストがルートに依存する場合では、2つのオブジェクト間でリレーションがどのようにインスタンス化されますか?

+0

そのキャスト文にブレークポイントを設定してみてください。どのようなタイプのオブジェクトが 'bodyOut'にあるのか、スーパークラスと実装されているインタフェースが何であるかを見てください。 – Jerry101

+0

SoapObjectがノードを直接的または間接的に拡張するかどうかを調べる – GurV

+0

何らかの方法で関連付ける必要があります。そうでない場合、コードはコンパイルされません。もう一度見てください。 – EJP

答えて

0

writeBodyのソースコードは、SoapEnvelopeにあります。このメソッドは、SoapSerializationEnvelope ...およびでオーバーライドされます。バージョンではbodyOutオブジェクトをNodeにキャストしません。

私の分析は、これらのソースのリンクに基づいています。

(。では82d9ac4c90bb818f9e8efe8049ca1978cd019d70をコミット)


はの実装、と述べました012のこれらのメソッドはうまくいかないようです... SoapSerializationEnvelopeではなくSoapEnvelopeをインスタンス化して使用しようとしたことがあります。

+0

最初のコードのコンパイル方法を説明します。コンパイルされなかった場合、クラスは存在しないため、2番目の実装が拡張/オーバーライドするメソッドがなく、コンパイルもされません。 – EJP

+0

@EJP - 'bodyOut'は' SoapEnvelope'の 'Object'として宣言されています。私たちが見ている' writeBody'メソッドが宣言されています。したがって '((Node)this.bodyOut)'がコンパイルされます。 –

+0

@EJP - 上記のリンクを介して文脈でコードを見てください。 –