2015-09-11 16 views

risposta

3

Si può sempre passare null, ma il blocco delle chiamate che, sì l'unico parametro valido sarebbe SomeObject.class che viene caricato con lo stesso ClassLoader come la classe che contiene void f(Class<SomeObject> clazz).

È possibile avere più istanze distinte di SomeObject.class, ma dovranno essere caricate da diversi classloader (altrimenti non saranno istanze separate, ma si riferiranno allo stesso oggetto Class).

8

Sì.

come descritto al documentation:

restituisce la classe runtime di questo oggetto. L'oggetto Classe restituito è l'oggetto bloccato dai metodi statici sincronizzati della classe rappresentata .

Ma per il metodo void f(Class<SomeObject> arg) è possibile passare qualcosa come void f(Class<? extends SomeObject> arg). Guarda this question.

Passando un Class<? extends SomeObject arg si può fare qualcosa di simile:

myMethod(Class<? extends BasicObject> clazz) 
{ 
    if (!clazz.isInstance(CodeObject)) 
    { 
     (do something different) 
    } 
    ... 
} 
+0

Grazie! Quindi, sarebbe inutile definire void f (Classe arg) in quanto accetterebbe solo SomeObject.class? –

+0

No! SomeObject può essere esteso, quindi se hai un oggetto esteso puoi gestirlo nel metodo. – Victor

+1

@Alex Può sembrare privo di significato, ma può essere utile in alcuni scenari speciali.Ad esempio, se tu avessi classe 'MyClass ' con 'init (Classe clazz)' il metodo e poi ne estenderesti, o qualcosa del genere. – kajacx

0
  1. forse C'e cosa in questo modo?

    Classe <? estende SomeObject>

questo è la notazione per la classe di SomeObject o sovrascrive (qualcosa di sbagliato con la sintassi evidenziatore, non accettano?, spazio tra <? non è richiesta)

0

Lo fa sembra vero che ogni classe ha una sola istanza Class corrispondente, vedere this discussion

Il metodo potrebbe anche essere invocato da un argomento raw Class :) sfortunatamente.

Class clazz = AnotherClass.class; 

f(clazz); 
Problemi correlati