3

アイデアは、以下のようなことを行い、コンパイル時に toLoad が AType オブジェクトを含むことができる配列であることをコンパイラにチェックさせることです (つまり、AType extends または T NOT T extends または 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 キーワード

おそらくすべきことは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 に答える