Oh right one more thing, the interface could define an opCast operator. I'm not sure whether `cast(Object)val` could fail in some cases due to the operator.