2012-04-09 20 views
17

Desarrollado por primera vez en Java y desarrollado por primera vez para Android, es una pregunta bastante nueva.¿Cómo funciona una propiedad '.class'?

Actualmente tengo este código:

public void onBtnClicked(View v){ 
    /** Handles button navigation */ 

    @SuppressWarnings("rawtypes") 
    Class c; 
    int viewId = v.getId(); 

    switch (viewId) { 

    case R.id.btnNewTourny : 
     c = NewTourny.class; 
     break; 
    case R.id.btnTeamEditor : 
     c = EditTeam.class; 
     break; 
    case R.id.btnCatEditor : 
     c = EditCat.class; 
     break; 
    case R.id.btnLoadTourny : 
     c = EditCat.class; 
     break; 
    case R.id.btnNewCategory : 
     c = NewCat.class; 
     break; 
    default : 
     c = Main.class; 
    } 

    Intent myIntent = new Intent(v.getContext(), c); 
    startActivityForResult(myIntent, 0); 
} 

Breve pregunta:

Lo que hace la propiedad .class hacer, por ejemplo salir en 'c = NewTourny.class'?

¿Por qué no puedo lanzar c como Tourny (que es el padre de todas estas clases)?

largo pregunta:

Este maneja actualmente todas las navegaciones de botón largo de mi aplicación, y funciona bien. Sin embargo, como puede ver, he suprimido una advertencia de "tipo de raw", que aparece cuando lanzo c como clase. Ahora, realmente quiero un código sin advertencias, así que pensé 'bueno, todas estas clases son hijo de' Tourny '', así que pensé que funcionaría, lanzando c como Tourny, pero eso no funciona. Entonces me di cuenta de que realmente no sabía lo que el código "NewTourny.class" en realidad hacía, y esa puede ser la clave de por qué no pude lanzar c como Tourny. Entonces, ¿qué hace .class?

Respuesta

9

Realmente no do mucho. NewTourney.class es una forma más específica de idioma para escribir "el objeto que es la clase de NewTourney". Esta abreviatura permite referirse a la clase de a NewTourney, en oposición a tratar con ya existentes instancias de NewTourney.

En su caso específico, me atrevería a adivinar que el Activity eventualmente crea una instancia de la clasepara manejar la acción, o al menos para mantener los datos sensibles al contexto de la acción.

+0

significa esto, que no puedo evitar la proyección de c como clase, y así evitar la advertencia ? – LongInt

+0

Clase c; lo haría desaparecer? o Clase c; si es posible que ni siquiera sea una actividad! – Blundell

+0

Clase arroja este error: _Tipo de discrepancia: no se puede convertir de la clase a la clase _, pero la clase funciona. – LongInt

2

Clase es una clase que representa las clases. :)

No es "Objeto". No es una superclase o incluso en su jerarquía de "NewTourny". Es por eso que no puedes transmitir desde un NewTourney a una clase.

La propiedad .class es una instancia de Clase que representa información de tipo.

Puede usarlo para hacer llamadas de estilo reflexivo para crear una instancia de algo que no conoce el tipo de en tiempo de compilación.

+6

En realidad, una 'Clase' es un' Objeto' que representa una _clase_. Las clases son objetos, que es una de las necesidades idiosincrásicas para manipular una 'clase 'dentro de una JVM, que solo tiene dos tipos de datos, primitivos y descendientes de' Object'. –

1

Para deshacerse de la advertencia, puede cambiar Class c con Class<? extends Tourny>. Esto significa que c no es un objeto, que representa una de todas las clases posibles, pero más específicamente representa una clase derivada por Tourny.

+0

Dado que c puede señalar muchos tipos diferentes de clases, debe declararse Clase . –

+0

Al cambiarlo a la clase c, aparece este error en cada línea de mi declaración de cambio: _Tipo de discrepancia: no se puede convertir de la clase a la clase _ – LongInt

+0

@ Michael Krussel: ¡Eso fue lo que eliminó la advertencia! Gracias. – LongInt

1

El método .class es uno que tienen todos los objetos que le permiten hacer referencia a la naturaleza original de ese objeto incluso antes de que tuviera la oportunidad de inicializarlo. No es el padre, es la plantilla original no adulterada de sí misma. Se llama ".class" porque es una representación directa de la clase que solo la definición de clase puede influir. Le ahorra tener que crear un nuevo objeto para obtener información que todos los miembros de esa clase tienen originalmente en común.

2

Instancias de la clase donde Clase representan clases e interfaces en una aplicación Java en ejecución. Esto es parte de Java Reflection API. De Oracle tutorial:

If the type is available but there is no instance then it is possible to obtain a Class by appending ".class" to the name of the type. This is also the easiest way to obtain the Class for a primitive type.

Estas son algunas referencias:

  1. https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
  2. https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html
Cuestiones relacionadas