将对象转换为原始类型

5
我正在尝试通过网络发送一个Collection<myClass>。我将其转换为Object并通过网络发送。
我认为模拟在网络中传递的项目的最佳方法是通过一个Object,因为我无法预先知道它可能是什么(在此示例中,它是一个Collection,但有时它可能是地图或其他任何你能想到的东西)。这有点像C语言中套接字的工作方式,只有接收者和发送者知道他们正在发送/接收的内容,并适当地对对象进行类型转换,而连接只关心字节并正确地传输它们。
然而,当接收Object时,如果我尝试将其强制转回collection<myObject>,会出现警告提示不安全的类型转换。我可以添加@suppressWarnings,但最好的方法是如何转换以避免此警告?
谢谢

2
正确的解决方案确实是@SuppressWarnings,如果您确定转换实际上是安全的。任何其他解决方案都只会在其他地方抑制警告。 - Louis Wasserman
我不喜欢被旨在帮助我的工具束缚,但事实是我使用“sonar”,即使我添加了@ SuppressWarnings,我仍然会在sonar中遇到错误。是否有一种方法可以禁用sonar警告呢? - shkra19
你确定SONAR警告是出于同样的原因吗?警告说了什么? - JB Nizet
是的,你说得对,抱歉这又是一个警告。我会将其标记为我的答案...如果你可以将其转化为一个答案。 - shkra19
2个回答

3

当您(尤其是Java)无法确定接收到的对象类型时,将其安全转换是不可能的。

您可以采取以下措施:

  • 确信它就是您认为的对象
  • 可以添加try-catch块以捕获ClassCastException(以确保更加安全)
  • 最后,添加@SuppressWarnings注释,因为您想要覆盖Java的安全检查(因为您认为自己更懂)

@sdasdadas 我想这不会起作用,因为只有在接收数据时才能创建Object实例。如果您认为自己知道所获得的内容,可以创建另一种类型的对象,但那样就不再需要使用instanceof了。 - Veger
我原以为他在寻找类似这样的东西:https://dev59.com/inE85IYBdhLWcg3wtVxT,但也许我误解了问题。 - sdasdadas
这并不能帮助检查集合是否为Collection<MyObject>。 - JB Nizet
@JBNizet 但他说过,“在这个例子中,它是一个集合,但有时它可能是一个映射或任何你能想到的其他东西”。 - sdasdadas
1
他问:“有什么最好的方法可以进行强制类型转换,以避免这个警告吗?”但实际上并没有。你可以检查它是否是Collection的一个实例,但你无法检查它是否是Collection<MyObject>的一个实例。 - JB Nizet

1
考虑使用一些中间格式进行序列化,比如JSON或XML。有很多库可以将对象编组和解组为JSON格式,例如GSON。您所获得的免费好处是语言互操作性,因为在另一端可能有任何语言的程序。

我并不反对使用 JSON 或 XML(事实上,我已经在项目的其他部分中这样做了),但是这怎么改变了作为编写网络部分的程序员,我不知道正在传递的对象类型的事实(只能从发送者/接收者得知)?如果不是 Object 类,我应该使用什么类? - shkra19
-1并没有解决原帖作者的问题,唯一的影响就是将不安全的转换移到其他地方。 - Louis Wasserman
这是不正确的,你不必强制转换任何东西。请查看 https://sites.google.com/site/gson/gson-user-guide(反序列化)。实际上,使用 @SuppressWarnings 是相当糟糕的编程实践。而且大多数情况下都可以避免使用它。 - Jiri Kremser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接