If the property of the result type is mutable, then casting it to CharSequence would be unsafe. You would be able to assign any CharSequence to it, whereas in fact only String is allowed in your last example.
Marking the type variable as “out RESULT” would theoretically solve this unsafeness in your last example. Though I don’t know whether the compiler is smart enough to smart cast then.
Another way to make it safe is using non-open classes. That is, I don’t see why your original example could be unsafe. Still, the compiler was not smart enough.