I don't like exposing this idiom in our public API.  Let's just make retain() non-final and override return types manually.