Well, I wasn’t aware of Ticket #1737 when I was trying to find a solution to the problem from my previous post. Thanks to Jorge Ortiz for pointing this out. However, I reviewed my approach to solving this and didn’t find sever limitations. Maybe someone else does…
When I initially stumbled on this, I remembered that existential types where introduced into Scala for coping with Java’s raw types. But there is an additional twist here, we need to tell the compiler that our MyIterator implementation actually ‘is an instance of a raw type’. So combining existential types with self types led me to the following solution:
class MyIterator extends Iterator2 {
this: java.util.Iterator[_] =>
def hasNext = true
def remove = throw new Error
def next = "infinity"
}
We can now safely use instances of MyIterator.
def test1(it: MyIterator) = {
println(it.next)
}
def test2(it: java.util.Iterator[_]) = {
println(it.next)
}
val it = new MyIterator
val v: String = it.next
println(v)
test1(it)
test2(it)
The approach using existential types in combination with self types makes sure that values returned from the next method always are typed correctly.
Nice! That’s an interesting workaround. Don’t think I’d ever seen it before.