2012-04-09 19 views
17

La prima volta che si sviluppa in Java e si sviluppa per la prima volta per Android, quindi è una domanda abbastanza nuova.Come funziona una proprietà '.class'?

Al momento ho questo codice:

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 domanda:

Che cosa significa la proprietà .class fare, f.ex. in 'c = NewTourny.class'?

Perché non posso trasmettere c come Tourny (che è il padre di tutte queste classi)?

domanda a lungo:

Questo gestisce attualmente tutte le navigazioni dei pulsanti in tutta la mia app, e funziona bene. Tuttavia, come puoi vedere, ho soppresso un avvertimento "rawtype", che viene quando lancio cast come classe. Ora, voglio davvero un codice senza avvisi, quindi ho pensato 'bene, tutte queste classi sono un figlio di' Tourny '', quindi ho pensato che avrebbe funzionato, lanciando c come Tourny - ma questo non funziona. Poi mi sono reso conto che non sapevo veramente quale fosse il codice "NewTourny.class", e questo potrebbe essere il motivo per cui non potevo lanciare c come Tourny. Quindi, cosa fa .class?

risposta

9

In realtà non lo fa do. NewTourney.class è più un modo specifico per scrivere "l'oggetto che è la classe di NewTourney". Questa stenografia consente di fare riferimento alla classe di a NewTourney, anziché a specifiche istanze già esistenti. NewTourney.

Nel vostro caso specifico, mi azzarderei a indovinare che il Activity alla fine crea un'istanza della classe per gestire l'azione, o almeno per contenere i dati sensibili al contesto dell'azione.

+0

Questo significa, che non posso evitare di getto C come classe, e quindi evitare l'avvertimento ? – LongInt

+0

Classe c; lo farebbe andare via? o Classe c; se è possibile che non sia nemmeno un'attività! – Blundell

+0

Classe genera questo errore: _Tipo non corrispondente: impossibile convertire dalla Classe alla Classe _, ma la Classe funziona. – LongInt

2

Classe è una classe che rappresenta le classi. :)

Non è "Oggetto". Non è una superclasse o persino nella tua gerarchia "NewTourny". Ecco perché non puoi trasmettere da NewTourney a una classe.

La proprietà .class è un'istanza di Class che rappresenta le informazioni sul tipo.

È possibile utilizzarlo per effettuare chiamate in stile riflessivo per creare un'istanza di cui non si conosce il tipo in fase di compilazione.

+6

In realtà, un 'Class' è un' Object' che rappresenta un _class_. Le classi sono oggetti, che è una delle necessità idiosincratiche per manipolare una 'classe' all'interno di una JVM, che ha solo due tipi di dati, primitive e discendenti di' Object'. –

1

Per eliminare l'avviso, è possibile modificare Class c con Class<? extends Tourny>. Ciò significa che c non è un oggetto, che rappresenta una delle possibili classi, ma più specificamente rappresenta una classe derivata da Tourny.

+0

Poiché c può indicare diversi tipi di classi, deve essere dichiarato Classe . –

+0

Quando lo cambio in Classe c, ottengo questo errore in ogni riga della mia istruzione switch: _Type mismatch: impossibile convertire dalla classe alla classe _ – LongInt

+0

@ Michael Krussel: Questo ha fatto il compito di rimuovere l'avviso! Grazie. – LongInt

1

Il metodo .class è uno di tutti gli oggetti che consentono di fare riferimento alla natura originale di tale oggetto prima ancora che avessi la possibilità di inizializzarlo. Non è il genitore, è il modello originale non adulterato di se stesso. Si chiama ".class" perché è una rappresentazione diretta della classe che solo la definizione della classe può influenzare. Ti evita di dover creare un nuovo oggetto per ottenere informazioni che tutti i membri di quella classe hanno in comune.

2

Istanze della classe in cui Classe rappresentano classi e interfacce in un'applicazione Java in esecuzione. Questo fa parte dell'API di java Reflection. Da 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.

Ecco alcuni riferimenti:

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