Come utilizzare i tipi strutturali nelle chiamate isInstanceOf?
-
27-10-2019 - |
Domanda
Il titolo fondamentalmente lo dice.
Esiste un modo per utilizzare il tipo di e.g.new Object {def foo = "bar"}
in una chiamata isInstanceOf[<structural_type_here>]
?
Soluzione
I tipi strutturali non funzioneranno con isInstanceOf
.Allo stesso modo, le corrispondenze di pattern con i tipi strutturali sono prive di significato (corrispondono sempre).
Questo di solito è attribuito alla cancellazione del tipo, ma anche in assenza di cancellazione non funzionerebbe, poiché JVM non comprende i tipi strutturali.
D'altra parte, Scala avrebbe potuto essere abbastanza intelligente da far funzionare il controllo del tipo strutturale attraverso la cancellazione.
Altri suggerimenti
Vorrei dire che puoi utilizzare un alias di tipo:
type HasFooMethod = { def foo: String }
val v = new Object {def foo = "bar"}
v.isInstanceOf[HasFooMethod]
Ma tornerà sempre vero, grazie alla cancellazione.
Quindi puoi usare la reflection o semplicemente provare a passare l'oggetto a un metodo che prende un tipo strutturale come parametro: il compilatore quindi commetterà un errore se non è valido.