与this question相关
给定此功能:
public static <S extends CharSequence> S foo(S s) {
return (S) new StringBuilder(s);
}
为什么这个调用无例外地执行:
foo("hello");
但这会引发ClassCastException吗?
System.out.println(foo("hello"));
最佳答案
Java 5/6中的泛型为type-erased,这意味着任何泛型类型在运行时基本上都是Object
类型(或任何最小公分母类型,在这种情况下为CharSequence
)。在需要的地方插入适当的演员表。因此,您的方法将被擦除为如下所示的类型:
public static CharSequence foo(CharSequence s) {
return (CharSequence) new StringBuilder(s);
}
这样您的呼叫就被删除了:
System.out.println((String)foo("hello"));
显然,如果从不使用返回值,Java不会费心插入
(String)
强制转换-为什么要麻烦?