type parameter method generic example create java generics casting unchecked

parameter - object generic java



Cómo evitar las advertencias de conversión sin marcar con Java Generics (3)

Puede usar la siguiente anotación para hacer que el compilador no genere esas advertencias:

@SuppressWarnings("unchecked")

Vea esta pregunta relacionada que trata el mismo problema. La respuesta le explicará todo lo que necesita saber.

De alguna manera mi vieja pregunta estaba cerrada, así que abro una nueva:

Estoy usando Java Generics para implementar un mapa Hash bidireccional genérico de una consulta SQL. Debería poder mapear cualquier combinación de String, pares enteros de un lado a otro. Se debe utilizar de esta manera:

String sql = "SELECT string_val, int_val FROM map_table"; PickMap<String, Integer> pm1 = new PickMap<String, Integer>(sql); String key1 = "seven"; Integer value1 = pm1.getLeft2Right(key1); Integer key2 = 7; String value2 = pm1.getRightToLeft(key2);

Por supuesto, debería ser posible crear un pm (Integer, Integer) y así sucesivamente ...

Mi implementación de Pick Map se ve así (sin el getter ...):

public class PickMap<L, R> { private final HashMap<L, R> left2Right = new HashMap<L, R>(); private final HashMap<R, L> right2Left = new HashMap<R, L>(); public PickMap(String sql) throws OException { DTable d = new DTable(sql); int colTypeL = d.t.getColType(1); int colTypeR = d.t.getColType(2); Extractor<L> extLeft = (Extractor<L>) getInstance(colTypeL); Extractor<R> extRight = (Extractor<R>) getInstance(colTypeR); int numRows = d.t.getNumRows(); for(int i=1;i<=numRows;i++) { L leftVal = extLeft.extract(d, i); R rightVal = extRight.extract(d, i); this.left2Right.put(leftVal, rightVal); this.right2Left.put(rightVal, leftVal); } } private Extractor<?> getInstance(int type) { if(type == 1) return new IntExtractor(); else return new StringExtractor(); } } interface Extractor<E> { E extract(DTable source, int row); } class IntExtractor implements Extractor<Integer> { @Override public Integer extract(DTable source, int row) { int value = 5; return new Integer(value); } } class StringExtractor implements Extractor<String> { @Override public String extract(DTable source, int row) { String retVal = "hello"; return retVal; } }

No tengo errores de compilación y estoy bastante seguro de que funcionará de esta manera. PERO estoy recibiendo advertencias de desecho sin marcar en los métodos de "getInstance" donde lanzo Extractor (E) a Extractor (L) ...

¿Cómo debo lanzar correctamente? ¿O qué me estoy perdiendo? ¿O debería simplemente suprimir esas advertencias?


Recibes advertencias porque no se puede demostrar que lo que estás haciendo sea seguro. Está asumiendo que getInstance(colTypeL) devolverá un Extractor<L> , pero eso no se puede verificar ni en tiempo de compilación ni de ejecución.

Puede usar @SuppressWarnings("unchecked") como lo mencionaron otros, pero trataría de repensar el diseño un poco.


Si está utilizando Spring Framework, puede usar CastUtils:

import static org.springframework.data.util.CastUtils.cast;

obj.setString(cast(someObject)); String bob = cast(someObject);