ad

《JAVA服务端研发知识图谱》_让你更懂Java后台研发_1.7.2 通配符

admin 134 2023-10-25

【摘要】 本书摘自《JAVA服务端研发知识图谱》一书中第1章,第7节,由何为、迟文恒 编著。

1.7.2 通配符

Fruit 是 Apple 类的基类,那么List和 List之间是什么关系呢?看看下面的例子。

public static void testExtendWildcard(){

Listapples =new ArrayList ◇();

apples.add(new Apple());

//Listfruits =apples;

《JAVA服务端研发知识图谱》_让你更懂Java后台研发_1.7.2 通配符

List fruits2 = apples;

//fruits2.add(new Apple());

fruits2.get(0).print()

public static void testSuperWildcard(){

List fruits =new ArrayList ◇(;

fruits.add(new Fruit());

List apples = fruits;

apples.add(new Apple())

((Fruit)apples.get(0)).print();

通过代码发现, List和 List之间并没有关系,尤其需要注意的是,不要以为 它们是继承关系。如果想用另 一个容器指代 List, 就用到了通配符,可以用 List来 指 代 List。 此用法大多作为方法的参数判断,例如某方法参数需要一个 Fruit 子类的容器。另外还需注意,无法通过 List向容器中添加数据,只能获取 数据。原因就是这个容器指代了一切继承自 Fruit 的类的容器,所以无法确定是否正确地向容器 中添加了适当的类型。例如当? Extend Fruit 指代一个 Apple 容器时,如果向容器中添加 Orange 对象就会出现错误。

List指代了 Fruit 至 Apple 及派生类继承关系链的对象,可以向其添加对象, 因为添加的对象类型更加明确,可以通过类型转换成基类 Fruit来获取和使用对象。

1.7.3 泛型接口

Java 的泛型区别于 C++ 的泛型实现主要在类型擦除。类型擦除就是说 Java 泛型只在编译期间 进行静态类型检查,编译器生成的代码会擦除相应的类型信息,这样到了运行期间实际上 JVM 根 本就不知道泛型所代表的具体类型。也就是说在运行期间无法识别List和 List, 因 为它们都是 List。 但是也不是毫无办法,可以定义一个泛型接口,然后让泛型类声明传进 的具体类型必须实现此接口,这样还能保留部分接口能力。public interface PrintInterface{

public void print();

以上是声明的泛型接口,这个接口希望保留打印的能力。其实最常用的泛型接口是 Comparable, 它保留了对象比较的能力。

1.7.4 自定义泛型

声明了泛型接口,下面的代码将演示泛型接口在泛型类中是如何使用的。

class Tomato implements PrintInterface{

@Override

public void print(){

System.out.println("It is Tomato!");

}

public class CustomTemplete>{

public T data;

public void print(){

data.print();

}

public static void main(String/) args){

CustomTemplete custom Templete =new CustomTemplete~(0; customTemplete.data =new Tomato();

customTemplete.print();

运行结果如下:

It is Tomato!

创建了一个继承自泛型接口的 Tomato 类,并且重写了接口方法用来打印数据。泛型类 CustomTemplete 通过>表示,传入的类型必须继承此泛型接口。所以 可以在main方法中调用泛型类的打印,如果不继承此接口,那么 data 对象在泛型内部并不知道 自己具备什么能力(仅具备 Object对象能力)。

以上介绍了泛型的常用方法和一些与其他语言不同的地方,同时还在 Java 泛型擦除的现实 下保留了部分接口能力。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:阅读《基于Python语言的软件测试技术》_打开新的知识大门_2.2.5 项目配置管理体系
下一篇:《基于Kubernetes的容器云平台实战》_了解最新技术前沿_4.2.2 Harbor的镜像同步机制
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×