tipo objeto metodos manejo instanciar genericos generico genericas datos crear con comparar comodin como clases arreglos java json eclipse generics

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; } ... }