我目前正在用一个中型编码示例更新我的 Java 知识。我有一个数据结构Map<String, String>
,通常用它来初始化它new LinkedHashMap<>()
以保留插入顺序。我在我的代码中经常使用它,我想摆脱声明重复。在 C++ 中,我会为地图设置别名,但据我所知,在 Java 中没有别名。
所以我想出了像这样子类化泛型的想法:
public class Attributes extends LinkedHashMap<String, String> {
public Attributes() {
super();
}
public Attributes(Map<? extends String, ? extends String> map) {
super(map);
}
}
到目前为止这看起来不错,但现在我想创建一个不可修改的副本,因为属性应该是不可变/不可修改数据结构的一部分。在我使用这个之前:
Map<String, String> unmodifiableAttributes = Collections.unmodifiableMap(
new LinkedHashMap<>(attributes)
);
这不适用于派生类,我试过这个:
Attributes unmodifiableAttributes = Collections.unmodifiableMap(
new Attributes(attributes)
);
编译器用 拒绝它Incompatible types
。
有没有一种简单的方法可以获取此类子类的不可修改(或不可变)副本?还是我的想法完全错误?我不想写一个功能齐全的装饰器,就几行代码。
更新
到目前为止,我想做的事情似乎没有好的解决方案。我查看了 Java Collections 类的源代码,其中有用于不可修改的映射和类似集合的内部类。这些用于包装输入集合并由相应的静态方法返回。可以重新实现这一点,但我认为开销太大。
我们更多地讨论了 LSP 违规而不是原来的问题,这确实也是一个有趣的问题。