Class<SomeObject>
ha solo un'istanza che è SomeObject.class
?La classe <SomeObject> ha una sola istanza?
Vale a una funzione
void f(Class<SomeObject> arg)
è possibile passare solo SomeObject.class
altrimenti compilazione errore di tempo?
Class<SomeObject>
ha solo un'istanza che è SomeObject.class
?La classe <SomeObject> ha una sola istanza?
Vale a una funzione
void f(Class<SomeObject> arg)
è possibile passare solo SomeObject.class
altrimenti compilazione errore di tempo?
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).
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)
}
...
}
Sì
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)
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);
Grazie! Quindi, sarebbe inutile definire void f (Classe arg) in quanto accetterebbe solo SomeObject.class? –
No! SomeObject può essere esteso, quindi se hai un oggetto esteso puoi gestirlo nel metodo. – Victor
@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