前回のエントリで何気なくでてきた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していないだけということ。
ややこしい。