此问题相关

鉴于这种功能:

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"));

显然Java将不会打扰插入(String)投如果返回值是从来没有使用过,何必呢?

其他提示

通用类型只适用于编译器,并在运行时被erasured(基本上略)。所以铸造在方法中忽略

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top