建网站业务员,南京编程培训机构,宁波自助建站公司,医疗做网站作者 | 阿Q来源 | 阿Q说代码事情是这样的#xff1a;对话中的截图如下#xff1a;看了阿Q的解释#xff0c;你是否也和“马小跳”一样存在疑问呢#xff1f;请往#x1f447;看我们都知道在java中#xff0c;只要是类型兼容#xff0c;就可以将一种类型的对象分配给另一… 作者 | 阿Q来源 | 阿Q说代码事情是这样的对话中的截图如下看了阿Q的解释你是否也和“马小跳”一样存在疑问呢请往看我们都知道在java中只要是类型兼容就可以将一种类型的对象分配给另一种类型的对象。比如可以将一个Integer类型的对象分配给Object类型的对象因为Object 是Integer的超类。Object someObject new Object();
Integer someInteger new Integer(10);
someObject someInteger; //OK在面向对象中我们把它称之为 is a 的关系。因为Integer是Object的一种子类所以允许被赋值。又因为Integer也是Number的一种子类所以下边的代码也是有效的public void someMethod(Number n) { /* ... */ }someMethod(new Integer(10)); // OK
someMethod(new Double(10.1)); // OK当然泛型也是如此在执行泛型类型调用时将Number作为其类型参数传递如果参数是Number的子类型则允许任何后续的add调用BoxNumber box new BoxNumber();
box.add(new Integer(10)); // OK
box.add(new Double(10.1)); // OK现在我们来看以下代码public void boxTest(BoxNumber n) { /* ... */ }该方法接收什么类型的参数呢通过该方法大家肯定知道它的参数类型为BoxNumber但是大家思考一个问题你认为BoxInteger 和BoxDouble类型的参数可以传入吗答案是否定的。尽管Integer是Number的子类型但BoxInteger 和BoxDouble不是BoxNumber的子类它俩的父类对象是Object。文首的对话表达的就是这个意思。那么问题来了当类的泛型相关时如何在两个泛型类之间创建类似子类型的关系呢例如如何让BoxInteger 和BoxDouble变得与BoxNumber有关呢为了搞懂这个问题我们先来了解一下同一类型的对象是如何实现子类型化的吧。通过分析源码我们可以发现ArrayListE 实现了 ListEListE 继承了CollectionE所以ArrayListString是ListString的子类型 ListString是 CollectionString的子类型。因此当我们在传递参数时ArrayListString类型的是可以给ListE或者CollectionE传递的。只要不改变类型参数类型之间的子类型关系就会保留。如果我们想要定义我们自己的列表接口PayloadList使得泛型类型P的可选值与每个元素相关联可以定义如下interface PayloadListE,P extends ListE {void setPayload(int index, P val);...
}则PayloadListString,String、PayloadListString,Integer、PayloadListString,Exception都是ListString的子类型。小结可以通过继承泛型类或者实现接口来对其进行子类型化。搞懂了子类型化的问题我们回到“如何在两个泛型类之间创建类似子类型的关系“的问题。泛型类或者接口并不会仅仅因为它们的类型之间有关系而变得相关如果要达到相关我们可以使用通配符来创建泛型类或接口之间的关系。BoxInteger 和BoxNumber的父类对象其实是Box?为了在这些类之间创建关系以便代码可以通过BoxInteger访问BoxNumber的方法可以使用上限通配符:Box? extends Integer initBox new Box();
Box? extends Number numberBox initBox;
// OK. Box? extends Integer is a subtype of Box? extends Number因为Integer是Number的子类型numberBox的泛型是Number对象子类所以在intBox和numberBox之间存在关系。图为用上限和下限通配符声明的几个类之间的关系。往期推荐Redis 缓存击穿失效、缓存穿透、缓存雪崩怎么解决如果被问到分布式锁应该怎样回答三分钟教你用 Scarlet 写一个 WebSocket AppJava 底层知识什么是 “桥接方法” 点分享点收藏点点赞点在看