今天粗略的看了generic,泛型的基本功能,在C++中早就有了,不过Java中的generic的确多了很多东西,但是也正如许多人批判的,一大堆尖括号让代码变丑了,呵呵,不过我才刚开始学,没有体会
基本功能不废话了,今天觉得比较印象深刻的是generic的类型转换,也就是说:
LinkedList<Float> ff = new LinkedList<Float>();
LinkedList<Number> nn ;
nn = ff;
这样是错误的,虽然Number是Float的父类,generic的类型转换只限于
基础类型,也就是说
List<Float> kk = ff;
是正确的。同样,如果
Number n = new Float(3.2);
ff.add(n);
这样同样不能通过编译。
之所以generic本身不能有类型转换(也就是使用参数的父类),我个人觉得主要是因为generic这个功能本身是一种编译期间的检查,而不是JVM的一种
改进,所有的generic类型,都会在编译期间被erasure(擦除)掉,实际上,上
面的代码经过编译后,JVM实际看到的代码应该是
LinkedList ff = new LinkedList();
具体的generic是不存在的,被擦除了。还有没有其他原因,还要继续深入学习才行~
generic也可以进行类型限制,即类似下面
class gTest<TT extends Runnable>{
public void get(TT tt){
tt.run();
}
}
这里有点奇怪的是,Runnable明明是接口,但是这里却不用implements,而是统一用extends。我手头这本书没有讲,下次要借本专门的书来看看
最后,关注《Java in a Nutshell 第五版》