2011-01-30 20 views
1

標題基本上是這麼說的。如何在isInstanceOf調用中使用結構類型?

有沒有辦法使用e類型。 G。 new Object {def foo = "bar"}撥打電話isInstanceOf[<structural_type_here>]

+2

有關提示,請參閱http://stackoverflow.com/questions/1988181/pattern-matching-structural-types-in-scala。 – Debilski 2011-01-30 19:27:12

回答

3

結構類型不適用於isInstanceOf。同樣,與結構類型匹配的模式也沒有意義(它們總是匹配)。

這通常歸咎於類型擦除,但即使沒有擦除,它也不起作用,因爲JVM不理解結構類型。

另一方面,斯卡拉可能已足夠聰明,通過擦除進行結構類型檢查工作。

+0

這給人以錯誤的印象,認爲擦除根本不涉及......結構類型被擦除爲「對象」(加上一點反射),並且它是`isInstanceOf`運行的運行時類型。這是因爲`isInstanceOf`與擦除類型一起工作,它總是會返回true,但您說反射*也*在運行時運行,並且Scala理論上能夠處理這樣的表達以符合預期的行爲。 – 2011-01-31 09:21:15

3

我想說的是,你可以使用一個類型別名:

type HasFooMethod = { def foo: String } 
val v = new Object {def foo = "bar"} 
v.isInstanceOf[HasFooMethod] 

但是會永遠感謝返回true,來擦除。

因此,您可以使用反射,也可以嘗試將對象傳遞給以結構類型作爲參數的方法 - 如果編譯器無效,則會發生錯誤。