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.emptyList返回 a List<T>,其实现是隐藏的。由于您的MyCustomList界面是 的扩展List因此无法在此处使用该方法。

为了让它工作,你需要实现一个 empty MyCustomList,就像核心 APICollections实现一个空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

在您的情况下,在您正确实现您的接口之前,这是不可能的MyCustomList

UPD: Collections.emptyList()返回接口的特殊实现,List当然不能转换为你的MyCustomList.

于 2013-01-14T05:04:51.003 回答
0

你不能Collections.emptyList()用于这个目的。这是类型安全的,似乎可以满足您的需求!

于 2013-01-14T05:29:42.277 回答