2013-07-26 2 views
0

Je rencontre un problème lorsque la boucle suivante génère une erreur Incompatible types: Required: Workstation, Found: java.lang.Object. Avec tout ce qui est tapé, je ne peux pas comprendre pourquoi il trouve un objet au lieu de l'objet tapé.Types incompatibles - Objet trouvé lors de l'utilisation de génériques

private static WorkflowProcess getWorkflowProcessByWorkstationRecursive(Collection<WorkflowProcess> workflowProcesses) { 
    for (WorkflowProcess workflowProcess : workflowProcesses) { 
     for (Workstation workstation : workflowProcess.getWorkstations()) //ERROR IS HERE 

WorkflowProcess.java

abstract public class WorkflowProcess<WorkstationType extends Workstation> { 

    private ArrayList<WorkstationType> workstationList = new ArrayList<WorkstationType>(); 

    public ArrayList<WorkstationType> getWorkstations() { 
     return workstationList; 
    } 

ServerWorkflowProcess.java

abstract public class ServerWorkflowProcess extends WorkflowProcess<ServerWorkstation> { 

ServerWorkstation.java

abstract public class ServerWorkstation extends Workstation<ServerWorkflowProcess> { 

Il est un peu compliqué, mais essentiellement la hiérarchie de classe ressemble à ceci:

SpecificWorkflowProcess étend TypeOfWorkflowProcess<TypeOfWorkstaton> étend WorkflowProcess

SpecificWorkstation étend TypeOfWorkstation<TypeOfWorkflowProcess> étend Workstation

WorkflowProcesses-Workstation = Un à plusieurs

+0

'WorkflowProcess # getWorkstations()' déclaration? – m0skit0

+0

Généralement, il est préférable de commencer par la première erreur * ou avertissement * dans le fichier en premier. –

Répondre

4

Le problème est que vous utilisez le brut type WorkflowProcess. Cela signifie que l'API que vous obtenez est effectivement l'effacement de l'API normale, de sorte que le type de retour getWorkstations devient juste ArrayList.

Vous pouvez corriger cela facilement:

private static WorkflowProcess getWorkflowProcessByWorkstationRecursive(
    Collection<WorkflowProcess<?>> workflowProcesses) { 
    for (WorkflowProcess<?> workflowProcess : workflowProcesses) { 
    .. 
    } 
} 

En utilisant le caractère générique, vous dites essentiellement « Je sais que les médicaments génériques sont impliqués ici, mais je ne me dérange pas vraiment ce que le paramètre de type WorkstationType est dans la collection ".

+0

Si je sais que la liste sera toujours 'étendre Workstation' à un certain niveau, est-il préférable de faire toujours un'? étend Workstation'? – Webnet

+1

@Webnet: Vous savez déjà que parce qu'il est dans la description du paramètre de type 'WorkstationType' ... il est pas comme ça pourrait être autre chose. –

0

Vous devez ajouter le paramètre générique du type de workflowProcess dans la deuxième ligne:

private static WorkflowProcess getWorkflowProcessByWorkstationRecursive(Collection<WorkflowProcess> workflowProcesses) { 
    for (WorkflowProcess<Workstation> workflowProcess : workflowProcesses) { 
     for (Workstation workstation : workflowProcess.getWorkstations()) 
Questions connexes