標題基本上是這麼說的。如何在isInstanceOf調用中使用結構類型?
有沒有辦法使用e類型。 G。 new Object {def foo = "bar"}
撥打電話isInstanceOf[<structural_type_here>]
?
標題基本上是這麼說的。如何在isInstanceOf調用中使用結構類型?
有沒有辦法使用e類型。 G。 new Object {def foo = "bar"}
撥打電話isInstanceOf[<structural_type_here>]
?
結構類型不適用於isInstanceOf
。同樣,與結構類型匹配的模式也沒有意義(它們總是匹配)。
這通常歸咎於類型擦除,但即使沒有擦除,它也不起作用,因爲JVM不理解結構類型。
另一方面,斯卡拉可能已足夠聰明,通過擦除進行結構類型檢查工作。
這給人以錯誤的印象,認爲擦除根本不涉及......結構類型被擦除爲「對象」(加上一點反射),並且它是`isInstanceOf`運行的運行時類型。這是因爲`isInstanceOf`與擦除類型一起工作,它總是會返回true,但您說反射*也*在運行時運行,並且Scala理論上能夠處理這樣的表達以符合預期的行爲。 – 2011-01-31 09:21:15
我想說的是,你可以使用一個類型別名:
type HasFooMethod = { def foo: String }
val v = new Object {def foo = "bar"}
v.isInstanceOf[HasFooMethod]
但是會永遠感謝返回true,來擦除。
因此,您可以使用反射,也可以嘗試將對象傳遞給以結構類型作爲參數的方法 - 如果編譯器無效,則會發生錯誤。
有關提示,請參閱http://stackoverflow.com/questions/1988181/pattern-matching-structural-types-in-scala。 – Debilski 2011-01-30 19:27:12