[#789] | project: compiler | priority: low | category: missing feature | |
---|---|---|---|---|
submitter | assigned to | status | date submitted | |
Burak | Martin | fixed | 2006-10-24 18:40:52.0 | |
subject | more accurate type tests | |||
code |
object main { // don't do this at home trait Impl trait SizeImpl extends Impl { def size = 42 } trait ColorImpl extends Impl { def color = "red" } type Both = SizeImpl with ColorImpl def info(x:Impl) = x match { case x:Both => "size "+x.size+" color "+x.color // you wish case x:SizeImpl => "size "+x.size case x:ColorImpl => "color "+x.color case _ => "n.a." } def main(args:Array[String]): Unit = { // make up some class that has a size class MyNode extends SizeImpl Console.println("hello " + info(new MyNode)) } } |
|||
what happened | deprecation warning, and runtime classcast exception |
|||
what expected | couldn't we rewrite a type test isInstanceOf[Both] into isInstanceOf[SizeImpl] && isInstanceOf[ColorImpl] ? |
|||
[back to overview] |
Martin edited on 2006-10-26 11:10:44.0 |
We could, but then you also need to put the right asInstanceOf's. I.e.
if (x.isInstanceOf[SizeImpl] && x.isInstanceOf[ColorImpl]) x$0 = x.asInstanceOf[SizeImpl] x$1 = x.asInstanceOf[ColorImpl] "size "+x$0.size+" color "+x$1.colorIt's feasible. It might be worth the added complexity, but I am not sure yet. |
Burak edited on 2006-10-26 15:12:54.0 |
Yes, but that is already done somehwere! Try -print:erasure on the example, the asInstanceOfs are correct. It's only the instanceOf that needs action, unless I am missing some interactions. |
Martin edited on 2006-11-01 16:45:24.0 |
Now it typechecks, and produces a classcast exception. We still need to add the double instanceOf test. Reassigned to Burak. |
Martin edited on 2006-11-01 17:25:08.0 |
After discussing with Burak we decided that the changes are best made in Erasure. So I took care of it. |