※ 引述《PsMonkey (痞子军团团长)》之铭言:
: 重点在于,`UnmodifiableCollection` 并没有实作 `hashCode()` 跟 `equals()`,
: 所以当你要一个 `UnmodifiableCollection` 作 `hashCode()` 时,
: 会直接使用 `Object` 的 `hashCode()`。
这个题目很有意思
与其说 UnmodifiableCollection 没有实作 hashCode 与 equals
更精确的说法是: UnmodifiableCollection 没办法有意义地实作 hashCode 与 equals
原因在于 delegate pattern: UnmondifiableCollection 与其原本的 Collection
之间是 has-a 而非 is-a 的关系
原文里举了以下这个例子
List L = { /* a list of things */ }
Collection C1 = L.unmodifiableCollection();
Collection C2 = L.unmodifiableList();
bool B1 = C1.equals(C2);
bool B2 = C2.equals(C1);
这时候
1. 在 Java 里, B1 与 B2 必须有一样的结果
2. List.equals(x) 规定, 如果 x 不是 List, 那就不能传回 true
3. C2 是个 List
4. C1 只是个 Collection
因为 #2, 3, 4, 所以 B2 必须传回 false