gpt4 book ai didi

Java - 从无界通配符转换为字符串

转载 作者:行者123 更新时间:2023-11-30 06:18:15 25 4
gpt4 key购买 nike

所以,一开始我有一句话是这样说的:

Object input = .... //some come code initialising it
if(input instanceof Set<String>) {
doSomething(input);
}

但是,由于泛型类型信息在运行时被删除,我无法指定它是 Set<String>而是无限通配符 Set<?> 。但我需要使用这个集合来进行与字符串相关的处理,例如附加到 JTextArea,因此当我需要字符串输出时,这种无界通配符类型不是很有用。

所以,我尝试了这个

Object input = .... //some come code initialising it
if(input instanceof Set<?>) {
doSomething((Set<String>) input);
}

此转换将其从无界类型转换为字符串类型(我确信如果输入是 Set<String> ,它将是 Set ),但这不是很安全,不是吗?我收到一条错误消息,说我可以抑制未经检查的 Actor 阵容,但我觉得可能还有另一种方法来解决这个问题。有什么想法吗?

编辑:初始化input通过从专用 LAN IP 上的服务器套接字的输入流进行序列化。

最佳答案

您可以检查您的对象以确保它仅包含 String s:

if(input instanceof Set<?> && ((Set<?>)input).stream().allMatch(x -> x instanceof String)) {
doSomething((Set<String>)input);
}

您仍然需要抑制警告。这比原来的更安全,因为如果该集合仅包含 String s(或者为空),它通常可以被视为 Set<String> 。然而,它仍然相当不安全,因为,例如,您可能反序列化了一个空的 EnumSet 。安EnumSet需要将其元素转换为 Enum s 获取他们的ordinal() s,但是一个String不能那样做!您可能需要先将该集合复制到您自己的集合中:

if(...) {
Set<String> input2 = new HashSet<>();
input2.addAll((Set<String>)input);
doSomething(input2);
}

这只迭代元素 input ,它不太可能爆炸,并防止您将元素提供给 input它无法处理。请注意,不仅仅是插入是不安全的,简单地检查集合中是否存在错误类型的项目也可能会导致集合爆炸。

关于Java - 从无界通配符转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48769862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com