Collections.emptyList
List<T>
実装がhiddenである を返します。あなたのMyCustomList
インターフェースは の拡張でList
あるため、そのメソッドをここで使用する方法はありません。
これを機能させるにはMyCustomList
、コア API が空のCollections
実装を実装するのと同じ方法で、空の のList
実装を作成し、代わりにそれを使用する必要があります。例えば:
public final class MyEmptyCustomList<T> extends AbstractList<T> implements MyCustomList<T> {
private static final MyEmptyCustomList<?> INSTANCE = new MyEmptyCustomList<Object>();
private MyEmptyCustomList() { }
//implement in same manner as Collections.EmptyList
public static <T> MyEmptyCustomList<T> create() {
//the same instance can be used for any T since it will always be empty
@SuppressWarnings("unchecked")
MyEmptyCustomList<T> withNarrowedType = (MyEmptyCustomList<T>)INSTANCE;
return withNarrowedType;
}
}
より正確には、実装の詳細としてクラス自体を非表示にします。
public class MyCustomLists { //just a utility class with factory methods, etc.
private static final MyEmptyCustomList<?> EMPTY = new MyEmptyCustomList<Object>();
private MyCustomLists() { }
private static final class MyEmptyCustomList<T> extends AbstractList<T> implements MyCustomList<T> {
//implement in same manner as Collections.EmptyList
}
public static <T> MyCustomList<T> empty() {
@SuppressWarnings("unchecked")
MyCustomList<T> withNarrowedType = (MyCustomList<T>)EMPTY;
return withNarrowedType;
}
}