14、泛型类、接口,和类型通配符
2015-03-26 12:13
295 查看
在定义类和接口时,可以传入泛型参数(类型形参),用尖括号
显然,K和V只能用来做声明对象之类的动作,调用方法是不可能的。
在方法的参数中,也可以使用泛型,但是跟定义类和接口时不一样,不能使用尖括号加任意形参的形式
即使没有使用T,上面代码也是错误的,不能通过编译,如下形式是正确的:
Circle是Shape的一个子类,但是List<Circle>不是List<Shape>的子类,所以List<Circle>不能作为drawAll方法的参数,如下代码会引起编译错误
在方法的参数列表中,可以使用带类型通配符的泛型
在方法的参数中,?通配符过于麻烦(需强制转换)且不安全(各种类型皆可传入)。可以使用带限制的类型通配符
同样的,在定义类和接口时使用泛型,也可以设定类型形参的上限,例如:
public interface Map< K, V>
显然,K和V只能用来做声明对象之类的动作,调用方法是不可能的。
在方法的参数中,也可以使用泛型,但是跟定义类和接口时不一样,不能使用尖括号加任意形参的形式
public void drawAll(List<T> shapes) { }
即使没有使用T,上面代码也是错误的,不能通过编译,如下形式是正确的:
class Canvas { public void drawAll(List<Shape> shapes) { for(Shape s : shapes) { s.draw(this); } } }
Circle是Shape的一个子类,但是List<Circle>不是List<Shape>的子类,所以List<Circle>不能作为drawAll方法的参数,如下代码会引起编译错误
List<Circle> circleList = new ArrayList<>(); Canvas c = new Canvas(); c.drawAll(circleList);//此行错误
在方法的参数列表中,可以使用带类型通配符的泛型
class Canvas { public void drawAll(List<?> shapes) { for(Object obj : shapes) { Shape s = (Shape)obj; s.draw(this); } } }问号“?”表示各种类的父类,此处没有限定,则表示Object类,所以使用时要强制转换。通配符即表明类型未知且可变,所以这样带通配符(不管有没有限定)声明一个List是不能往里面添加元素的。
<pre name="code" class="java">List<?> lc = new ArrayList<String>();//或者<span style="font-family: Arial, Helvetica, sans-serif;">List<? extends xxxx> lc = new ArrayList<String>()</span>lc.add(new String());
lc.add(new Object());上面的后两行都会引起编译错误。
在方法的参数中,?通配符过于麻烦(需强制转换)且不安全(各种类型皆可传入)。可以使用带限制的类型通配符
class Canvas { public void drawAll(List<? extends Shape> shapes) { for(Shape s : shapes) { s.draw(this); } } }这样一来,只需要List<?>中的?继承自Shape即可,也可以是Shape自身,Shape被称为这个通配符的上限。Shape本身是一个抽象类,draw是一个抽象方法,传入不同的List<?>,就会调用不同的draw,这也正是利用了多态性。
同样的,在定义类和接口时使用泛型,也可以设定类型形参的上限,例如:
public interface Map< K extends T, V>此时K声明的对象就可以使用T的方法
相关文章推荐
- 1.4--1.5.4 泛型类A<Integer>与接口Interface A<Integer>、自动装箱/拆箱Integer->int、菱形运算符<>、数组协变、通配符?
- 【Go语言】【14】GO语言的接口类型
- Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限
- Java学习笔记14:接口只用于定义类型
- 泛型类以及类型通配符
- 泛型类, 方法,接口,通配符
- JAVA基础再回首(十六)——泛型的概述、使用、泛型类、泛型方法、泛型接口、泛型高级(通配符)
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
- Java泛型总结之定义泛型接口、类和类型通配符
- 黑马程序员--Java基础加强--17.利用反射操作泛型VI【泛型类型变量的语义】【GenericDeclaration接口】【泛型接口TypeVariable】【通过Class反射解析泛型类】
- [疯狂Java]泛型:类型参数多态问题、类型通配符(?)、类型通配符的上下限、类型参数的上限(类、接口)
- 泛型(Generic):了解泛型、泛型的应用、?通配符和泛型的限定、泛型方法和类型推断、泛型类、用反射获得实际
- Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限
- 从字节码角度分析泛型类,泛型方法,泛型接口的实现机制(类型擦除)
- Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限
- 牛客网Java刷题知识点之泛型概念的提出、什么是泛型、泛型在集合中的应用、泛型类、泛型方法、泛型接口、泛型限定上限、泛型限定下限、 什么时候使用上限?泛型限定通配符的体现
- 编写高质量代码改善C#程序的157个建议——建议97:优先考虑将基类型或接口作为参数传递
- golang基础-接口、接口嵌套、类型断言、接口与结构体_接口等转换
- 第三部分:Android 应用程序接口指南---第三节:应用程序资源---第五章 资源类型