0

Parameterizedそのため、個々の汎用型オブジェクトのロードでJUnitテストランナーを呼び出そうとしています。使用される特定のクラスは、子孫クラスに知られています。

もともと私はJUnitが動作するためにを返すメソッドを取得することができましたが、Collection<T>JUnitが実際に必要であることに気付きましたCollection<T[]>-ジェネリックの配列を作成することにJavaが気が進まない/拒否するため、この配列を作成するのに問題があります。

protected static <T> Collection<T> someMethod(Class<T> someClass)
{
    Collection<T> result = new ArrayList<T>();
    T someBean;
    while (someCondition(...))
    {
        //Do some stuff to compute someBean

        result.add(someBean);
    }
    return result;
}

現在、JUnitには次のCollection<T[]>ようなものが必要です。

// (descendant class)
@Parameters
public static Collection<SomeActualClass[]> data()
{
    return someMethod(SomeActualClass.class);
}

だから私は次のようなことをしてリターンタイプを変更したいと思います:

protected static <T> Collection<T[]> someMethod(Class<T> someClass)
{
    Collection<T[]> result = new ArrayList<T>();
    T someBean;
    while (someCondition(...))
    {
        //Do some stuff to compute someBean

        result.add(new T[]{someBean});
    }
    return result;
}

残念ながら、ジェネリック配列を作成できないため、Javaではこれを実行できません。

私は声明を次のように言いたくなりresult.add((T[])new Object[]{someBean});ますが、これは安全ですか?またはもっと良い方法はありますか?

4

2 に答える 2

0

それは地獄のように厄介ですが、次のように動作するはずです:

T[] theArray = (T[]) Array.newInstance(someClass, 1);
theArray[0] = someBean;

参照:

public class Foo<T> {

    final T t0;
    final T t1;
    final Class theClass;

    public Foo(T t0, T t1, Class<T> theClass) {
        this.t0 = t0;
        this.t1 = t1;
        this.theClass = theClass;
    }

    @SuppressWarnings("unchecked")
    public T[] getStuffArray() {
        T[] theArray = (T[]) Array.newInstance(theClass, 2);
        System.out.println(theArray.getClass().getName());
        theArray[0] = t0;
        theArray[1] = t1;
        return theArray;
    }

    public static void main(String[] args) {

        Number[] stuffArray = new Foo<Number>(1, 2.5, Number.class).getStuffArray();
        for (Number s: stuffArray) {
            System.out.println(s);
        }
    }
}

安全であることが本当に確実な場合は、スキップsomeClassして を使用することもできますが、それ自体ではなくのサブクラスであるsomeObject.getClass()というリスクを冒すことになり、上記の場合は に入れようとすることになります。someObjectTTArrayStoreException2.5Integer[]

(ただし、それを過ぎた場合-保存するだけの場合Integers-Javaはそれをにキャストすることで逃げることができることに注意してInteger[]くださいNumber[]。理由は聞かないでください。)

于 2011-01-06T01:20:36.363 に答える
-1

を使用してからメソッドを使用するList<T>と、が得られます。toArray(T[])T[]

を使用して、要素が 1 つだけの一般的なリストを作成することもできます。Collections.singletonList(T o)

于 2010-11-22T12:12:51.983 に答える