2012-07-02 9 views
5

El siguiente código presentan un "molde sin control/sin confirmar" violación fundamental Uso de la sonda + FindBugs:sin control/elenco confirmado utilizando los genéricos múltiples grada

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 } 

¿Alguna idea de cómo debo evitar esta violación?

EDIT: Violación es en la línea 3

EDIT: firmas de los métodos siguen: ComponentContainer # addComponent (Componente) AlignmentHandler # setComponentAlignment (Componente, alineación)

+0

Espera, ¿hay realmente una forma de usar herencia múltiple en Java a través de lo que estás intentando? – BlackVegetable

+1

Incomplete. ¿Qué enunciado específicamente causa el error? También muestra las definiciones de 'addComponent()' y 'setComponentAligment()'. No somos lectores de la mente. –

+0

@BlackVegetable: Herencia de interfaz múltiple, sí. –

Respuesta

5

No hay reparto en el código fuente, pero en el bytecode resultante de la compilación existe. En el bytecode, los tipos genéricos se borran. El borrado de P es su primer límite, ComponentContainer. Por lo que el código de bytes es (casi) equivalente al código de bytes de este:

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

Findbugs se ve en ese código de bytes, y concluye que ese elenco de AlignmentHandler puede fallar, porque (por lo que findbugs ve) el método acepta cualquier ComponentContainer .

Esto es un error de findbugs; deberías abrir un informe de error. Me parece algo que se puede arreglar sin necesidad de analizar el código fuente. El bytecode también contiene los tipos reales (genéricos), y los findbugs deberían usar eso.

Cuestiones relacionadas