鉴于此功能:
public static <S extends CharSequence> S foo(S s) {
return (S) new StringBuilder(s);
}
为什么此调用无异常执行:
foo("hello");
但是这个抛出ClassCastException?
System.out.println(foo("hello"));
鉴于此功能:
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 中的泛型是类型擦除的,这意味着任何泛型类型在运行时基本上只是一个Object
类型(或任何最小公分母类型,在这种情况下是CharSequence
)。在需要的地方插入适当的演员表。因此,您的方法被类型擦除为如下所示的内容:
public static CharSequence foo(CharSequence s) {
return (CharSequence) new StringBuilder(s);
}
您的电话会被类型擦除为:
System.out.println((String)foo("hello"));
(String)
显然,如果从不使用返回值,Java 就不会费心插入强制转换——何必呢?
泛型类型仅对编译器可用,并在运行时被擦除(基本上省略)。所以在方法中忽略了演员表