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

未经检查的强制转换警告意味着,您正在尝试从原始类型强制转换为泛型类型。

您的execute方法返回 Object,但您正在转换为ArrayList<ProcInfo>泛型类型,因此编译器警告您执行的返回类型不是您所期望的。

有两种方法可以克服这个警告(我知道):

1)添加@SuppressWarnings 注释

2) 从 ArrayList 中删除泛型。

这些方法将消除编译器错误。

于 2012-12-12T21:45:50.613 回答
3

unchecked cast 警告意味着由于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 回答