1

这个问题有关

鉴于此功能:

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

为什么此调用无异常执行:

foo("hello");

但是这个抛出ClassCastException?

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

2 回答 2

6

Java 5/6 中的泛型是类型擦除的,这意味着任何泛型类型在运行时基本上只是一个Object类型(或任何最小公分母类型,在这种情况下是CharSequence)。在需要的地方插入适当的演员表。因此,您的方法被类型擦除为如下所示的内容:

public static CharSequence foo(CharSequence s) {
  return (CharSequence) new StringBuilder(s);
}

您的电话会被类型擦除为:

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

(String)显然,如果从不使用返回值,Java 就不会费心插入强制转换——何必呢?

于 2009-08-12T20:46:25.357 回答
3

泛型类型仅对编译器可用,并在运行时被擦除(基本上省略)。所以在方法中忽略了演员表

于 2009-08-12T20:45:29.287 回答