如何返回使用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;空列表实现?
答案 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()
用于此目的。这是类型安全的,似乎做你想要的!