泛型的子类型
只要两种类型能够相符,我们可以把一种类型的对象赋给另外一种类型的对象。例如,可以把一个Integer赋给一个Object,因为Object是Integer的父类之一。
Object someObject = new Object();
Integer someInteger = new Integer(10);
someObject = someInteger; // OK
在面向对象的编程中,Integer和Object之间的这种关系叫做 ”is a”,也就是说在本质上是相同的,Integer是一种Object,所以才允许上面的这种赋值。由于Integer也是Number的一种,所以下面的赋值也是有效的:
public void someMethod(Number n){
// method body omitted
}
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
someMethod(new Integer(10)); // OK
someMethod(new Double(10.1)); // OK
对于泛型来讲,上面的讨论的这种关系也是适用的。在一个泛型调用中,我们可以传递Number作为它的参数,但是在后续调用add方法的时候,我们使用和Number相符的类型作为其参数:
Box<Number> box = new Box<Number>();
box.add(new Integer(10)); // OK
box.add(new Double(10.1)); // OK
我们现在考虑下面的方法:
public void boxTest(Box<Number> n){
// method body omitted
}
上面这个方法能够接受的参数是什么呢?实际上,我们可以看出它的参数是Box<Number>。那么我们能不能传递Box<Integer>或者Box<Double>作为它的参数呢?不能,原因就是Box<Integer>和Box<Double>不是Box<Number>的子类型。
文章评论(0条评论)
登录后参与讨论