0%

Java泛型与类型擦除

偶然间发现了这么一段Java代码,作用是将以“,”分隔的字符串,解析为目标类型的List。我将其代码简化了一下,去掉了字符串分割之类的代码,剩下的大概示例如下:

java_generics  

一开始看到这段代码时是震惊的,String竟然可以强转为Long?竟然不报错而且运行了这么久?  后来分析了一下,复习了一下Java里面的泛型,茅塞顿开。

其实Java里面的泛型是“伪泛型”,与C++的模板区别还是比较大的。Java泛型中的泛型类型(上图中的T)只是用于类型约束与编译期检查,上述代码中的强转 "(T)str" 在运行期是没有意义的,然后List的类型也是被擦除的,List中实际上存储的是Object。因此最后该List中存储的元素其实是String--虽然它被声明为List<Long>。  

参考资料: