Название в основном говорит об этом.
Есть ли способ использовать тип e. г. new Object {def foo = "bar"}
в isInstanceOf[<structural_type_here>]
звонке?
Название в основном говорит об этом.
Есть ли способ использовать тип e. г. new Object {def foo = "bar"}
в isInstanceOf[<structural_type_here>]
звонке?
Структурные типы не будут работать с isInstanceOf
. Точно так же совпадения шаблонов со структурными типами бессмысленны (они всегда совпадают).
Обычно в этом винят стирание типов, но даже без стирания это не сработает, так как JVM не понимает структурные типы.
С другой стороны, Scala могла быть достаточно умной, чтобы заставить работать проверку структурных типов посредством стирания.
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 благодаря стиранию.
Таким образом, вы можете либо использовать отражение, либо просто попытаться передать объект методу, принимающему структурный тип в качестве параметра - тогда компилятор выдаст ошибку, если он недействителен.