是否存在“超类”方式来定义泛型中的类型或仅“扩展”?

时间:2013-03-08 00:06:34

标签: java generics

这个想法是做类似下面的事情并让编译器在编译时检查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);
}

2 个答案:

答案 0 :(得分:4)

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

以下是对其使用方式的说明:java generics super keyword

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

答案 1 :(得分: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;
    }