Иногда в Scala я обнаруживаю несоответствия типов, связанные с типами, зависящими от пути, но я легко могу предположить, что на самом деле типы совпадают. Вот простой пример:
trait Foo { trait Bar }
object Main extends App {
val foo1 = new Foo { }
val foo2 = foo1
def turkle(x: foo1.Bar) {}
turkle(new foo2.Bar {})
}
, что дает: "несоответствие типов; найдено: java.lang.Object с Main.foo2.Bar требуется: Main.foo1.Bar".
Теперь, конечно, пути Main.foo1.Bar
и Main.foo2.Bar
должны совпадать, так как мы написали val foo2 = foo1
. Мы можем это проверить, изменив последнюю строку на
turkle((new foo2.Bar {}).asInstanceOf[foo1.Bar])
, который компилируется и запускается без исключения.
Может ли Scala автоматически выполнять рассуждения подобным образом? Если так, как я могу это сделать?
(А если нет, есть ли перспективы для расширения системы типов в этом направлении?)
Я отмечу, что иногда Scala действительно выполняет такие рассуждения. Предположим, я изменил trait Foo
на object Foo
:
object Foo { trait Bar }
object Main extends App {
val foo1 = Foo
val foo2 = foo1
def turkle(x: foo1.Bar) {}
turkle(new foo2.Bar {})
}
Теперь все компилируется нормально: каким-то образом в Scala выяснилось, что Main.foo1.Bar
и Main.foo2.Bar
действительно совпадают с Foo.Bar
.