聊一聊Java 泛型全解
2.4 源码中泛型的使用,下面是List接口和ArrayList类的代码片段。
2.5 泛型类派生子类 父类派生子类的时候不能在包含类型形参,需要传入具体的类型 错误的方式:
正确的方式:
也可以不指定具体的类型,系统就会把K,V形参当成Object类型处理
2.6 泛型构造器 构造器也是一种方法,所以也就产生了所谓的泛型构造器。 和使用普通方法一样没有区别,一种是显示指定泛型参数,另一种是隐式推断
使用:
特殊说明: 如果构造器是泛型构造器,同时该类也是一个泛型类的情况下应该如何使用泛型构造器:因为泛型构造器可以显式指定自己的类型参数(需要用到菱形,放在构造器之前),而泛型类自己的类型实参也需要指定(菱形放在构造器之后),这就同时出现了两个菱形了,这就会有一些小问题,具体用法再这里总结一下。 以下面这个例子为代表
正确用法:
PS:编译器会提醒你怎么做的 2.7 高级通配符 2.7.1背景: 2.7.2 上界通配符 上界通配符顾名思义,表示的是类型的上界【包含自身】,因此通配的参数化类型可能是T或T的子类。 正因为无法确定具体的类型是什么,add方法受限(可以添加null,因为null表示任何类型),但可以从列表中获取元素后赋值给父类型。如上图中的第一个例子,第三个add()操作会受限,原因在于List和List是List的子类型。 它表示集合中的所有元素都是Animal类型或者其子类 List 这就是所谓的上限通配符,使用关键字extends来实现,实例化时,指定类型实参只能是extends后类型的子类或其本身。 例如: 这样就确定集合中元素的类型,虽然不确定具体的类型,但最起码知道其父类。然后进行其他操作。
2.7.3 下界通配符 下界通配符表示的是参数化类型是T的超类型(包含自身),层层至上,直至Object 编译器无从判断get()返回的对象的类型是什么,因此get()方法受限。但是可以进行add()方法,add()方法可以添加T类型和T类型的子类型,如第二个例子中首先添加了一个Cat类型对象,然后添加了两个Cat子类类型的对象,这种方法是可行的,但是如果添加一个Animal类型的对象,显然将继承的关系弄反了,是不可行的。 它表示集合中的所有元素都是Cat类型或者其父类 List 这就是所谓的下限通配符,使用关键字super来实现,实例化时,指定类型实参只能是extends后类型的子类或其本身 例如
2.7.4 无界通配符 任意类型,如果没有明确,那么就是Object以及任意的Java类了 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |