什么是未经检查的强制转换警告以及在这种情况下java期望做什么

时间:2012-12-12 21:44:29

标签: java xml-rpc

我是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 个答案:

答案 0 :(得分:3)

未经检查的投射警告意味着,您正尝试从原始类型转换为通用类型。

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

你可以通过两种方式克服这个警告(我知道):

1)添加@SuppressWarnings annotation

2)从ArrayList中删除generictype。

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

答案 1 :(得分: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
}

这两个演员都不会引发警告。

答案 2 :(得分:1)

如果您只是想忽略警告并确定它是安全的,请在行上方写上@SuppressWarnings(“未选中”),以便给您出错。

答案 3 :(得分:0)

execute()方法返回类型为Object,但您将其转换为更具体的类型ArrayList<ProcInfo>。编译器警告你,方法签名上不能保证它实际上是要转换的类型的对象。

如果您确信实现将返回您期望的类型,则可以通过将此注释添加到正在进行强制转换的方法中来告诉编译器不发出警告:

@SuppressWarnings("unchecked")