2

私はC/C++プログラマーであり、Javaを初めて使用します。次のコード(XML RPCサーバー/クライアントアプリケーションの一部)があり、-Xlintオプションに準拠すると警告が表示されます。

コード:

XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setServerURL(new URL("http://localhost:8081"));
config.setEnabledForExceptions(true);
config.setEnabledForExtensions(true);
XmlRpcClient client = new XmlRpcClient();
client.setConfig(config);
Object[] params = new Object[0];
//execute returns java.lang.Object . getProcInfo has return type ArrayList<ProcInfo> 
ArrayList<ProcInfo> list = (ArrayList<ProcInfo>)client.execute(config,"test.getProcInfo", params);

警告:

warning: [unchecked] unchecked cast

私が理解していないのは、そもそもなぜ警告があるのか​​ということです。他の関数から返しているのと同じオブジェクトにキャストしているときにチェックする必要があるのはなぜですか。必要がある場合でも、このチェックはコンパイラ自体では実行できないとしましょう。

この警告を修正するにはどうすればよいですか。

4

4 に答える 4

3

チェックされていないキャスト警告は、raw型からジェネリック型にキャストしようとしていることを意味します。

Objectexecuteを返すメソッドですが、ジェネリック型のメソッドをキャストしArrayList<ProcInfo>ているため、コンパイラは、executeの戻り型が期待したものではないことを警告します。

この警告を克服する2つの方法(私は知っています):

1)注釈を追加します@SuppressWarnings

2)ArrayListからgenerictypeを削除します。

これらのメソッドは、コンパイラエラーを排除します。

于 2012-12-12T21:45:50.613 に答える
3

チェックされていないキャスト警告は、Javaの型消去(ジェネリック型パラメーターは実行時に存在しないため、キャスト時にチェックできない)により、キャストが成功した場合でも、型が宣言されたジェネリック型と実際に一致するかどうかがわからないことを意味します。

この状況を排除するには、キャストしてArrayList<ProcInfo>キャストする代わりに、次のようにします。

List<?> list = (List<?>)client.execute(config,"test.getProcInfo", params);

これは、タイプ「いくつかの要素タイプを持ついくつかのリスト実装」を示します。次に、リストの要素にアクセスするときに、それらを次の場所にキャストしますProcInfo

for(Object element : list){
  final ProcInfo info = (ProcInfo) element;
  // do something with info
}

どちらのキャストも警告を発生させません。

于 2012-12-12T22:16:36.150 に答える
1

警告を無視して安全であると確信できる場合は、エラーが発生した行の上に@SuppressWarnings( "unchecked")と記述してください。

于 2012-12-12T21:50:17.260 に答える
0

メソッドのexecute()戻り型はObjectですが、より具体的な型にキャストしていますArrayList<ProcInfo>。コンパイラは、実際にキャスト先の型のオブジェクトになるというメソッドシグネチャの保証がないことを警告しています。

実装が期待する型を返すと確信している場合は、キャストが行われているメソッドにこのアノテーションを追加することで、警告を発行しないようにコンパイラーに指示できます。

@SuppressWarnings("unchecked")
于 2012-12-12T21:54:51.537 に答える