白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

Arrays.asListは固定長ですよ?

equalsAny - 白猫のメモ帳

前回のエントリで何気なくでてきたArrays.asList。
仕様を知らないと意外とはまり、そして仕様を確認してもう一回はまるという代物。

どういうことかというと、このメソッドで作ったリストはaddやremoveができない。
これらのメソッドを呼ぶとUnsupportedOperationExceptionが投げられる。
(ちなみにsetはできるので変更不可ではなく固定長)

さて、じゃあどうなってるのかなって実装を見るわけですよ。

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

なるほど、新規のArrayListを返しているのか。
・・・いや、ちょっと待とう。
どこにもaddとかができない要素が見つからない。

実際にこれと同じソースを書いてみてもaddやremoveはできてしまうのだ。

この謎は気づけば案外簡単だったりする。
ちょっと下の方を見ると、しれっとネストクラスがいるのである。
ArrayListって名前の。

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable {
    // 略
}

つまりこのAbstractListを継承したネストクラスが、
addとかをOverrideしていないだけということ。

ややこしい。