Entendiendo la relación entre la inferencia de tipo y el tipo de objetivo -- java camp Relacionados El problema

Understanding the relationship between type inference and target type


2
vote

problema

Español

En el fragmento de código a continuación, me gustaría saber por qué var.get("key").getClass() devuelve java.lang.Integer en lugar de java.lang.Object Desde el parámetro del método var es de tipo Map<String, Object> :

  public static void main(String[] args) {     useHashMap(new HashMap<>());  }  public static void useHashMap(Map<String, Object> var) {     var.put("key", 1);           System.out.println(var.get("key").getClass()); //prints : class java.lang.Integer }   
Original en ingles

In the code snippet below, I would like to know why var.get("key").getClass() returns java.lang.Integer instead of java.lang.Object since the method's parameter var is of type Map<String, Object> :

public static void main(String[] args) {     useHashMap(new HashMap<>());  }  public static void useHashMap(Map<String, Object> var) {     var.put("key", 1);           System.out.println(var.get("key").getClass()); //prints : class java.lang.Integer } 
  
 
 

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Eso es exactamente cómo se supone que es.

getClass() Devuelve la clase real de objeto de tiempo de ejecución, como dice Javadoc:

  /**      * Returns the runtime class of this {@code Object}. The returned      * {@code Class} object is the object that is locked by {@code      * static synchronized} methods of the represented class.      *      * <p><b>The actual result type is {@code Class<? extends |X|>}      * where {@code |X|} is the erasure of the static type of the      * expression on which {@code getClass} is called.</b> For      * example, no cast is required in this code fragment:</p>      *      * <p>      * {@code Number n = 0;                             }<br>      * {@code Class<? extends Number> c = n.getClass(); }      * </p>      *      * @return The {@code Class} object that represents the runtime      *         class of this object.      * @jls 15.8.2 Class Literals      */     public final native Class<?> getClass();   

Otro ejemplo es:

  Object o = 1; System.out.println(o.getClass());   

Salida:

  class java.lang.Integer   

El tipo de referencia es Object , el tipo de objeto en tiempo de ejecución es Integer .

La misma situación cuando está utilizando el tipo de referencia de la interfaz:

  decreasing = TRUE0  

Salida:

  decreasing = TRUE111  

El tipo de referencia aquí es decreasing = TRUE2 , sin embargo, es una interfaz sin implementación. El objeto real de tiempo real aquí es decreasing = TRUE3 .

 

That's exactly how it supposed to be.

getClass() returns the actual class of run-time object, as javadoc says:

/**      * Returns the runtime class of this {@code Object}. The returned      * {@code Class} object is the object that is locked by {@code      * static synchronized} methods of the represented class.      *      * <p><b>The actual result type is {@code Class<? extends |X|>}      * where {@code |X|} is the erasure of the static type of the      * expression on which {@code getClass} is called.</b> For      * example, no cast is required in this code fragment:</p>      *      * <p>      * {@code Number n = 0;                             }<br>      * {@code Class<? extends Number> c = n.getClass(); }      * </p>      *      * @return The {@code Class} object that represents the runtime      *         class of this object.      * @jls 15.8.2 Class Literals      */     public final native Class<?> getClass(); 

Another example is:

Object o = 1; System.out.println(o.getClass()); 

Output:

class java.lang.Integer 

The type of reference is Object, the type of run-time object is Integer.

The same situation when you are using interface reference type:

List<Integer> list = new ArrayList<>(); System.out.println(list.getClass()); 

Output:

class java.util.ArrayList 

The reference type here is List, however it's an interface without implementation. The actual run-time object here is ArraysList.

 
 

Relacionados problema

4  ¿Cómo puedo configurar los archivos de LookandFeel en Java?  ( How can i setup lookandfeel files in java ) 
Necesito configurar los archivos de LookandFeel en JDK 1.6. Tengo dos archivos: napkinlaf-swingset2.jar napkinlaf.jar ¿Cómo puedo configurar esto ...

98  ¿Cómo accedería a las propiedades de objetos desde un método de objeto? [cerrado]  ( How would you access object properties from within an object method ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

4  ¿Cómo configurar correctamente una aplicación Multi Module SpringMVC creada por AppFuse en Eclipse?  ( How to properly setup a multi module springmvc application created by appfuse in ) 
Estoy tratando de configurar un Multi Module Springmvc AppFuse Aplicación en Eclipse, pero parece que estoy enfrentando muchos errores en Eclipse después de i...

59  Haciendo que el eclipse se comporten como Visual Studio  ( Making eclipse behave like visual studio ) 
Estoy haciendo un desarrollo de Android, y prefiero mucho el estudio visual, pero tendré que usarlo eclipse para esto. ¿Alguien ha hecho una herramienta q...

3  ¿Consecuencias de dirigir un archivo de clase Java en diferentes JRE?  ( Consequences of running a java class file on different jres ) 
¿Cuáles son las consecuencias de ejecutar un archivo de clase Java compilado en JDK 1.4.2 en JRE 1.6 o 1.5? ...

76  ¿Cuál es el significado de la advertencia de seguridad de tipo en ciertos moldes genéricos de Java?  ( What is the meaning of the type safety warning in certain java generics casts ) 
¿Cuál es el significado de la advertencia ? Tipo de seguridad: el lanzamiento del objeto a LISTE & LT; INTEGER & GT; en realidad está revisando la lista de...

41  ¿El mejor componente de navegador Java / swing? [cerrado]  ( Best java swing browser component ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

266  ¿Cuál es la diferencia entre un INT y un entero en Java y C #?  ( What is the difference between an int and an integer in java and c ) 
Estaba leyendo más Joel en el software Cuando me encontré en Joel Spolsky diciendo algo sobre un tipo particular de programador que sabe la diferencia e...

17  ¿Cómo puedo ver qué hay en mi montón en Java?  ( How can i see what is in my heap in java ) 
He logrado obtener una "fugas" de memoria en una solicitud de Java que estoy desarrollando. Al ejecutar mi suite Juit Test, salgo al azar las excepciones de m...

116  Java LIB o APP para convertir el archivo CSV a XML? [cerrado]  ( Java lib or app to convert csv to xml file ) 
cerrado. Esta pregunta no cumple con pautas de desbordamiento de pila . Actualmente no está aceptando respuestas. ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos