返回通用空列表

时间:2013-01-14 05:02:22

标签: java generics

如何返回使用generic作为空列表的自定义对象?

我扩展了List接口并创建了自己的自定义类型

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

在一个类中,我有一个返回自定义列表的方法,但我总是遇到编译器错误。基本上这个方法的默认实现应该返回一个空列表,但我不能让它工作,因为我遇到下面的错误。 &#39;不兼容的类型&#39;

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

什么是正确的方式发送回来的&#39; generified&#39;空列表实现?

4 个答案:

答案 0 :(得分:2)

敷衍的impl有什么问题吗?

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

return new MyCustomListImpl<MyCustomBean>();

答案 1 :(得分:2)

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;
    }
}

答案 2 :(得分:0)

在您的情况下,在您正确实施界面MyCustomList之前,这是不可能的。

UPD: Collections.emptyList()返回List界面的特殊实现,当然这不能转换为您的MyCustomList

答案 3 :(得分:0)

您不能将Collections.emptyList()用于此目的。这是类型安全的,似乎做你想要的!