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)强制转换-为什么要麻烦?

07-24 09:45
查看更多