2009-09-29 10 views
0

Je suis sûr que mon problème est commun et je suis presque sûr qu'il n'a pas de solution facile.Problème avec les génériques en Java

donc: je une interface:

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); 
} 

Et j'ai aussi sa mise en œuvre - BubbleSortTask, son code est pas intéressant. L'idée principale de cette conception: nous pouvons diviser énorme tâche à sous-tâches, résoudre tous les sous-tâche, puis fusionner des solutions:

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()); 

Il fonctionne bien. Mais dans le cas général, je ne saurais rien la mise en œuvre concrète, je veux faire quelque chose comme ceci:

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); 
} 

Ce code ne fonctionne pas, je reçois ClassCastException de mergeSolutions (solutions). Mais j'espère que l'idée principale est claire. Je me demande comment dois-je résoudre ce problème?

Répondre

8

Spécifiez l'interface en termes de Collection au lieu d'une matrice.

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); 
} 
+0

Je vais essayer demain) – Roman

+0

remercient, maintenant ça marche bien – Roman

0

Je pense que votre problème passe Object [] aux mergeSolutions() alors que les t.mergeSolutions spécifiques() attend E [], quel que soit votre type E est.

Je ne suis pas expert, mais je pense que vous pourriez avoir besoin d'utiliser une réflexion pour obtenir votre type E et instancier votre solution comme E [] sur la base de ces informations

Questions connexes