objeto - metodos genericos java
JSON y genéricos en Java-Tipo de advertencia de seguridad (5)
Si no puede cambiar a otra biblioteca o modificar el código de esta biblioteca para que sea genérica, la única otra opción sería escribir un contenedor alrededor de esta biblioteca que lo use, y soporte adecuadamente los genéricos.
Por lo tanto, tendría su propia clase JSONObject
que contendría un org.json.simple.JSONObject
, extendería HashMap<String, Object>
e implementaría Map<String, Object>
, y contendría métodos de reenvío para todos los métodos de org.json.simple.JSONObject
.
Todavía tendría que poner @SuppressWarnings("unchecked")
en esta clase, pero estaría limitado a esta clase, y todo el resto de su código podría estar libre de advertencias genéricas o la supresión de ellas.
Tengo algunos datos almacenados en elementos de Java y debo devolverlos en un formato determinado: JSONObject. Si bien mi implementación funciona bien, sigo recibiendo un mensaje de advertencia de eclipse (Versión: Juno Service Release 2):
" Tipo de seguridad: el método put (Object, Object) pertenece al tipo sin formato HashMap. Las referencias al tipo genérico HashMap se deben parametrizar "
Este es mi código:
public interface Element {...}
public abstract class AbstractElement implements Element {...}
public final class Way extends AbstractElement {...}
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
public class WayToJsonConverter{
...
public JSONObject wayToJson(){
JSONObject obj = new JSONObject();
obj.put("id",way.getId());
...
return obj;
}
...
}
La línea problemática es: obj.put("id",way.getId());
¿Hay alguna manera de resolver este problema, y luego agregar @SuppressWarnings("unchecked")
?
¿Cuál es tu JSONObject, hereda de HashMap? Si lo hace, la advertencia probablemente significa que debe declarar la instancia de JSONObject de la siguiente manera:
JSONObject<String,Object> obj=new JSONObject<String,Object>();
Actualizado: mira la definición del JSONObject:
public class JSONObject extends HashMap
extiende HashMap pero no admite el tipo de parámetro, si su definición es
public class JSONObject<K,V> extends HashMap<K,V>
entonces podríamos escribir
JSONObject<String,Object> obj=new JSONObject<String,Object>();
y el método put ya no generará la advertencia
Podrías crear un objeto de mapa y luego hacer un lanzamiento explícito a JSONObject
Map<String, String> obj = new HashMap<String, String>();
obj.put("id",way.getId());
JSONObject jsonObj = (JSONObject) obj;
Pero tenga en cuenta que esto le restringirá solo incluya "Cadenas" en su JSON. y verá errores de compilación si coloca otra estructura de datos. Di una matriz.
FYI org.codehaus.jettison.json.JSONObject
no causará esta advertencia. Al utilizar codehaus ''JSONObject, también tiene la capacidad de detectar errores de análisis a través de org.codehaus.jettison.json.JSONException
. Visita https://github.com/codehaus/jettison para más detalles.
Otra opción es inicializar JSONObject
con un Map<String, Object>
(parametrizado) Map<String, Object>
. De esta forma, un valor puede ser de cualquier tipo JSON válido, y usted evita la advertencia unchecked
. P.ej:
public class WayToJsonConverter{
...
public JSONObject wayToJson(){
Map<String, Object> forJsonObj = new HashMap<>();
forJsonObj.put("id",way.getId()); // No warning, hurray!
forJsonObj.put("integer", 14);
forJsonObj.put("floating", 1.4);
JSONObject obj = new JSONObject(forJsonObj);
...
return obj;
}
...
}