2012-07-07 22 views
6

Tengo una clase simple Apple se extiende desde otra clase simple Fruta.¿Cómo averiguar el tipo declarado de un identificador en Java?

En tiempo de ejecución, que podría utilizar

Fruit fruit = new Apple(); 

fruit.getClass(); 

para obtener el tipo real del objeto de la fruta, que es Apple.class.

También podría usar fruit instanceof Apple y fruit instanceof Fruit para verificar si este objeto de fruta es una instancia de manzana o fruta. Ambas expresiones devuelven verdadero, lo cual es normal.

¿Pero hay una manera de determinar con precisión el tipo declarado de identificador fruit? Que en este caso es Fruit.

+1

Debe describir qué efecto desea alcanzar después de tener esa diferenciación. Creo que hay otras formas de resolver ese problema original. – Bananeweizen

+2

Tengo curiosidad sobre por qué quieres saber (cómo se declaró 'fruit'), y por separado, por qué no * ya * sabes (porque tienes el código en frente de ti). No se me ocurre un caso de uso. El objeto que 'fruit' apunta a ** es ** y' Apple'. Su interfaz a través de la variable 'fruit' es' Fruit', pero eso es una cosa puramente de tiempo de compilación. –

+0

¿Qué sentido tiene hacer esto? Has codificado la fruta para que sea Fruta, así que ya sabes que es lo que es. – DaveRlz

Respuesta

9

En realidad, está haciendo una pregunta acerca de la declaración de variable fruit en lugar del tipo de tiempo de ejecución real del objeto (que es un Apple en este caso).

Creo que esto es en general una mala idea: usted acaba de declarar la variable y le dijo al compilador que es un Fruit, entonces ¿por qué necesita ahora encontrarlo?

Sólo para confundir aún más las cosas, vale la pena señalar que también puede tener múltiples variables con diferentes tipos declarados referencia al mismo objeto (que sigue siendo un Apple):

Fruit fruit = new Apple(); // fruit declared as Fruit, but refers to an Apple 
Object thing = fruit;  // thing declared as Object, refers to the same Apple 

Si realmente quiere encontrar el tipo declarado, entonces usted tiene un par de opciones:

  • gane fruit una variable de instancia, y consultar el tipo declarado utilizando la reflexión.
  • Realice algún procesamiento del código fuente para encontrar la declaración de variable
  • Realice algún procesamiento del bytecode compilado para encontrar el tipo de declaración (aunque existe la posibilidad de que un compilador agresivo incluso pueda optimizar la declaración del tiempo de compilación completamente, por ejemplo, después de darse cuenta de que la fruta tan sólo puede ser una manzana en este código)

Creo que todos estos son bastante feo, así que mi consejo general sería "no lo hagas".

+2

Mala idea de hecho. Vale la pena mencionar que la variable es una entidad de tiempo de compilación. Puede que no exista en absoluto en tiempo de ejecución, si el compilador lo optimiza. – eran

+0

gracias @mikera, creo que tienes razón. Mi pregunta no tiene mucho sentido. Me preguntaba si podría obtener el tipo de tiempo de ejecución real del objeto, también podría obtener el tipo de la variable declarada que hace referencia a este objeto. Pero gracias:) –

3

El objeto Fruit no tiene un tipo declarado. Es la variable fruit que tiene su tipo. Como lo único que puede pasar es una referencia al objeto Fruit, no creo que su solicitud tenga mucho sentido. Lo mejor que puede obtener es si tiene una variable de instancia específica donde se almacena su objeto. A continuación, puede reflexionar sobre ese campo y obtener su tipo declarado con Field.getType().

3

No, no hay: al menos no se usa la reflexión. Reflection puede proporcionarle información sobre un objeto en tiempo de ejecución, así como campos, métodos y clases, pero no variables locales. Si la fruta era un campo, podría hacer algo como lo siguiente:

FruitBasket.class.getDeclaredField("fruit").getType(); 
Cuestiones relacionadas