0

context.lookup()ポータル アプリケーションで呼び出しの結果をキャストしようとしているときにClassCastException、異なる結果をキャストしようとして 3 回中 2 回失敗しました。

いくつかの調査の後、私はこれを考えます:http ://wiki.sdn.sap.com/wiki/display/TechTSG/%28AS+Java%29+ClassCastException+Occurs+After+Lookup+Operationは答えを保持していますが、そうではありません2つのステップを実行する方法を実際に説明してください。

このコードは、に保存されているパスから iView の詳細を取得するために機能しますlist

IiView transView1 = (IiView) context.lookup(list.get(i).toString());

しかし、次のようにワークセットの詳細を取得する場合:

IPcdContext attrSet = (IPcdContext) context.lookup(list.get(i).toString());

を取得しClassCastExceptionます。このエラーが発生する理由についてのヘルプまたは説明をいただければ幸いです。

編集:これはコードの基になっているものです: =真

edit2: context.lookup から返されたオブジェクトはcom.sapportals.portal.pcd.pcm.roles.PortalWorkset、ドキュメントが見つかりません。

4

1 に答える 1

1

context.lookupが返された場合、PortalWorksetClassCastException を「回避」する方法はありません。

キャストによってオブジェクトが別のクラスに変換されるわけではありません。これは、現在宣言されている型よりも具体的なクラスであることをコンパイラに伝える手段にすぎません。この場合、「lookup()メソッドが return と宣言されてObjectいることはわかっていますが、この特定のコンテキストで呼び出すと、常に具体的にIPcdContextオブジェクトを返すと確信しています。」ここでの仮定は成り立たないことが判明し、プログラムは例外をスローしてこれを正しく通知します。

問題には 2 つの原因が考えられます。

  1. あなたの仮定は一般的に正しいですが、論理的なバグのために、lookupメソッドに期待する文字列を渡していないため、間違ったものが完全に返されています。この場合、メソッドに渡されるパラメーターが常に正しいことを確認してください。
  2. あなたの仮定は間違っており、常に戻ってくるとは限りませIPcdContext。この場合、返された他のオブジェクトをどうするかを決定し、それらを適切に処理する必要があります (instanceof演算子を使用して、返されたオブジェクトのクラスを確認できます)。

いずれにせよ、キャストを行うときはいつでも、次のような慣用句を使用して、最初にキャストが成功することを確認することが通常有益です。

IPcdContext context;
Object obj = context.lookup("foo");
if (obj instanceof IPcdContext) {
    context = (IPcdContext)obj;
}
else {
    // You got back something else.  What to do?
}
于 2012-07-17T16:05:16.673 に答える