为什么这种通用方法不安全?

Eri*_*son 2 java generics warnings

以下方法会生成警告,但对我来说看起来很安全.我确定问题出在我身边:

public <S extends CharSequence> S foo(S s) {
    return (S) new StringBuilder(s);
}
Run Code Online (Sandbox Code Playgroud)

看起来这总是会返回参数s.任何人都可以展示一个会导致此方法抛出异常的示例吗?

编辑: 我对这里是否需要泛型的问题不是特别感兴趣.相反,我正在寻找这种方法不安全的演示.

ska*_*man 6

这是不安全的,因为虽然StringBuilder是CharSequence,但它不一定是S类型(事实上,它几乎肯定不会).你可以通过传入一个String方法来看到这个失败.这将StringBuilder使用您String的参数构建一个,然后尝试将您转换StringBuilderString(将失败).

这里可能根本不需要使用泛型,这应该可以正常工作:

public CharSequence foo(CharSequence s) {
    return new StringBuilder(s);
}
Run Code Online (Sandbox Code Playgroud)