为什么只在访问返回值时抛出ClassCastException?

时间:2009-08-12 20:43:16

标签: java classcastexception

this question

相关

鉴于此功能:

public static <S extends CharSequence> S foo(S s) {
  return (S) new StringBuilder(s);
}

为什么这个调用会毫无例外地执行:

foo("hello");

但是这个会抛出ClassCastException吗?

System.out.println(foo("hello"));

2 个答案:

答案 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)

通用类型仅供编译器使用,并在运行时被擦除(基本上省略)。因此在方法

中忽略了强制转换