Как использовать структурные типы в вызовах isInstanceOf?

Название в основном говорит об этом.

Есть ли способ использовать тип e. г. new Object {def foo = "bar"} в isInstanceOf[<structural_type_here>] звонке?


person soc    schedule 30.01.2011    source источник
comment
См. stackoverflow.com/questions/1988181/ для некоторых подсказок.   -  person Debilski    schedule 30.01.2011


Ответы (2)


Структурные типы не будут работать с isInstanceOf. Точно так же совпадения шаблонов со структурными типами бессмысленны (они всегда совпадают).

Обычно в этом винят стирание типов, но даже без стирания это не сработает, так как JVM не понимает структурные типы.

С другой стороны, Scala могла быть достаточно умной, чтобы заставить работать проверку структурных типов посредством стирания.

person Daniel C. Sobral    schedule 30.01.2011
comment
Это создает ложное впечатление, что стирание вообще не задействовано... Структурные типы стираются до Object (плюс немного отражения), и именно с этим типом среды выполнения работает isInstanceOf. Поскольку isInstanceOf работает со стертым типом, он всегда возвращает true, но вы правы, говоря, что отражение также работает во время выполнения и что Scala теоретически способна обрабатывать такое выражение, чтобы вести себя как ожидал. - person Kevin Wright; 31.01.2011

Я хотел бы сказать, что вы можете использовать псевдоним типа:

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

Но это всегда будет возвращать true благодаря стиранию.

Таким образом, вы можете либо использовать отражение, либо просто попытаться передать объект методу, принимающему структурный тип в качестве параметра - тогда компилятор выдаст ошибку, если он недействителен.

person Kevin Wright    schedule 30.01.2011