1

ジェネリックを空のリストとして使用するカスタム オブジェクトを返すにはどうすればよいですか?

List インターフェイスを拡張し、独自のカスタム タイプを作成しました

public interface MyCustomList<T>
  extends List<T>
{

クラスには、カスタム リストを返すメソッドがありますが、常にコンパイラ エラーが発生します。基本的に、このメソッドのデフォルトの実装は空のリストを返すはずですが、以下のエラーが発生しているため機能しません。「互換性のないタイプ」

public MyCustomList<MyCustomBean> getCodes(String code)
{
    return  Collections.<MyCustomList<MyCustomBean>>emptyList();
}

「一般化された」空のリストの実装を送り返す適切な方法は何ですか?

4

4 に答える 4

3

おざなりな impl に何か問題がありますか?

class MyCustomListImpl<T> extends ArrayList<T> implements MyCustomList<T> {}

return new MyCustomListImpl<MyCustomBean>();
于 2013-01-14T05:06:33.810 に答える
2

Collections.emptyListList<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;
    }
}
于 2013-01-14T05:21:43.207 に答える
0

Collections.emptyList()こんな用途には使えませんか。これはタイプセーフであり、あなたが探していることをしているようです!

于 2013-01-14T05:29:42.277 に答える
0

あなたの場合、インターフェースを適切に実装するまで、これは不可能ですMyCustomList

UPD: Collections.emptyList()インターフェースの特別な実装を返します。Listもちろん、これはあなたの に変換できませんMyCustomList

于 2013-01-14T05:04:51.003 に答える