Java中的泛型问题

时间:2009-09-29 22:14:47

标签: java generics

我确信我的问题很常见,我几乎可以肯定它没有简单的解决方法。

所以:我有一个界面:

public interface Task<E> extends Serializable {
    Task<E>[] splitTask (int partsNum);
    E mergeSolutions (E... solutions);
    E solveTask ();
    E getSolution ();
    Integer getId ();
    void setId (Integer id);
}

我也有它的实现 - BubbleSortTask,它的代码并不有趣。 这个设计的主要思想是:我们可以将巨大的任务分解为子任务,解决每个子任务然后合并解决方案:

    Integer[] array = {1, 4, 9, 3, 3, 0, 8, 2, 6};
    BubbleSortTask bst = new BubbleSortTask (array);
    Task[] ts = bst.splitTask (2);
    for (Task t : ts) {
        t.solveTask ();
    }
    bst.mergeSolutions (((BubbleSortTask)ts[0]).getSolution (),
                        ((BubbleSortTask)ts[1]).getSolution ());

效果很好。但总的来说,我对具体实现一无所知,我想做类似的事情:

public void processTask (Task t, int subtasksNum) {
    Task[] ts = t.splitTask (subtasksNum);
    for (Task t : ts) {
        t.solveTask ();
    }
    Object[] solutions = new Object[subtasksNum];
    for (int i = 0; i < subtasksNum; i++) {
        solutions[i] = ts[i].getSolution ();    
    }
    t.mergeSolutions (solutions);
}

此代码不起作用,我从mergeSolutions(解决方案)获得ClassCastException。但我希望主要观点是明确的。我想知道我该如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

使用Collection而不是数组来指定接口。

public interface Task<E> extends Serializable {
    Collection<? extends Task<? extends E>> splitTask (int partsNum);
    E mergeSolutions (Collection<? extends E> solutions);
    E solveTask ();
    E getSolution ();
    Integer getId ();
    void setId (Integer id);
}

答案 1 :(得分:0)

我认为你的问题是将Object []传递给mergeSolutions(),而特定的t.mergeSolutions()期望E [],无论你的E类型是什么。

我不是专家,但我认为您可能需要使用一些反射来获取您的E类型并根据该信息将您的解决方案实例化为E []