gpt4 book ai didi

java - Java 中接口(interface)定义集合的赋值

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:24 25 4
gpt4 key购买 nike

问题

我在项目中使用代码检查,它有特定的集合分配规则:

Assignment to Collection field 'this.wildcards' from parameter 'wildcards' at line XX

这是可以理解的,提示说得很清楚 - 由于集合可以在分配后在对象外部发生变异,这将是一种隐式状态修改,可能会导致许多难以检测的错误。

现在,我找到了this question其中建议了一些解决方案。就我而言,浅复制可能是最简单的选择,因为我知道集合非常简单,并且它的创建是一个简单的操作。

问题

我的问题是 - 如果我将集合成员定义为接口(interface)(就像最有可能完成的那样)会怎么样?我在这里看到一个潜在的问题。例如,我的 Collection 是 Map<>但要进行浅复制,我需要在那里定义确切的类型,例如 HashMap<> - 所以我可能会对我接受的类(class)的用户撒谎 Map<>因为事实上,我使用了它的一种特定实现。如果用户决定不使用HashMap<>但还有别的事..你明白了。

深思熟虑的想法

我当然可以缩小类型并明确表示我希望使用 HashMap<> - 但这是我不想做的事情,这是集合安全初始化的唯一原因。另外,我真的没有使用任何HashMap<> - 类逻辑中的特定内容,因此精确设置类型是一种浪费。

那么我的选择是什么?实现安全复制+不因此缩小成员集合类型的最佳方法是什么?

编辑:如果重要的话我使用 Java8

最佳答案

你为什么要把自己搞得这么复杂?只需使用 putAll ,可在 map 上找到:

public void initialize(final Map<K, V> wildcards) {
this.wildcards.clear();
this.wildcards.putAll(wildcards);
}

虽然它仍然缩小了可用于实例字段的 Map 实现的范围,但它只是那些支持 putAll 的实现... IIRC 所有 java API 实现都支持该操作...

关于java - Java 中接口(interface)定义集合的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37592898/

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