3

这个想法是做类似下面的事情,并让编译器在编译时检查 toLoad 是一个可以包含 AType 对象的数组(即:AType 扩展或者是 T NOT T 扩展或者是 AType)。有没有办法用泛型做到这一点?

private List<AType> aList_;

<T superclassof AType> T[] loadArray(T[] toLoad) {
    for(int i = 0; i < alist_.size(); ++i) {
        toLoad[i] = (T)aList_.get(i);
}
4

2 回答 2

4

改变我的答案。是的,有一个“超级”关键字可用于泛型,但我认为它不会在这里工作。

这里解释一下它是如何使用的:java generics super keyword

您可能应该做的是返回Collections.toArray()列表并将其绑定到您正在使用的类型(它本身可能是通用的)。我不认为你真的需要将返回类型定义为任何东西的超类。

于 2013-03-08T00:08:41.720 回答
4

不...... Java不允许类型变量的下限,即使有一些有效的用例......就像你的一样。

如果你使用List,我们可以使用带下限的通配符List<? super A>。但不适用于数组。

<L extends List<? super A> L load(L toLoad) 
{
    for(int i = 0; i < alist_.size(); ++i) 
        toLoad.set(i, aList_.get(i) );
    return toLoad;
}

不过,我们可以将数组包装在 List 中。

Object[] array = new Object[length];

load(new Wrapper<>(array));

class Wrapper<E> implements List<E>
{
    E[] array;

    Wrapper(E[] array){ this.array=array; }

    E set(int index, E element)
    {
        check index<array.length
        array[index] = element;
    }
于 2013-03-08T00:16:19.400 回答