0

所以我试图Parameterized在加载单个泛型类型对象时调用 JUnit 测试运行程序。要使用的特定类对于后代类是已知的。

最初我设法获得了一个方法,它返回一个Collection<T>供 JUnit 使用的方法,但后来我意识到 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[]为 a Number[]。不要问我为什么。)

于 2011-01-06T01:20:36.363 回答
-1

您可以尝试使用 aList<T>然后使用该toArray(T[])方法,您将得到一个T[].

您还可以创建一个只有一个元素的通用列表,使用Collections.singletonList(T o)

于 2010-11-22T12:12:51.983 回答