鉴于此功能:
public static <S extends CharSequence> S foo(S s) {
return (S) new StringBuilder(s);
}
为什么这个调用会毫无例外地执行:
foo("hello");
但是这个会抛出ClassCastException吗?
System.out.println(foo("hello"));
答案 0 :(得分:6)
Java 5/6中的泛型是type-erased,这意味着任何泛型类型基本上只是Object
类型(或者是最小公分母类型,在这种情况下是{{1}在运行时。在需要的地方插入适当的演员表。因此,您的方法会被类型擦除,看起来像这样:
CharSequence
你的电话会被删除类型:
public static CharSequence foo(CharSequence s) {
return (CharSequence) new StringBuilder(s);
}
如果永远不会使用返回值,那么Java显然不会插入System.out.println((String)foo("hello"));
强制转换 - 为什么要这么麻烦?
答案 1 :(得分:3)
通用类型仅供编译器使用,并在运行时被擦除(基本上省略)。因此在方法
中忽略了强制转换