2012-07-02 7 views
5

Il seguente codice solleva un "non confermata getto incontrollato /" violazione critica Utilizzo del sonar + FindBugs:incontrollato/del cast confermato che utilizzano farmaci generici più Bounds

1 public static <P extends ComponentContainer & AlignmentHandler> void addComponentAligned(P parent, Component child, Alignment alignment) { 
2  parent.addComponent(child); 
3  parent.setComponentAlignment(child, alignment); 
4 } 

Tutte le idee su come dovrei evitare questa violazione?

EDIT: La violazione è sulla linea 3

EDIT: firme Metodo seguono: ComponentContainer # addComponent (Component) AlignmentHandler # setComponentAlignment (Component, Alignment)

+0

Aspetta, c'è davvero un modo per utilizzare l'ereditarietà multipla in Java attraverso quello che stai tentando? – BlackVegetable

+1

incompleto. Quale affermazione causa specificamente l'errore? Mostra anche le definizioni di 'addComponent()' e 'setComponentAligment()'. Non siamo lettori della mente. –

+0

@BlackVegetable: ereditarietà dell'interfaccia multipla, sì. –

risposta

5

Non v'è alcuna fusione nel codice sorgente, ma nel bytecode risultante dalla compilazione esiste. Nel bytecode, i tipi generici vengono cancellati. La cancellazione per P è il primo limite, ComponentContainer. Così il bytecode è (quasi) equivalente al bytecode di questo:

public static void addComponentAligned(ComponentContainer parent, Component child, Alignment alignment) { 
    parent.addComponent(child); 
    ((AlignmentHandler)parent).setComponentAlignment(child, alignment); 
} 

Findbugs guarda che bytecode, e conclude che quel cast di AlignmentHandler potrebbe non riuscire, perché (per quanto findbugs vede) il metodo accetta qualsiasi ComponentContainer .

Questo è un bug di findbugs; dovresti aprire una segnalazione di bug. Mi sembra qualcosa che può essere risolto senza dover analizzare il codice sorgente. Il bytecode contiene anche i tipi reali (generici), e findbugs dovrebbe usarlo.