这一章节我们来讲述一下边界。
之前的章节已经提到,在jvm层面,泛型的类型信息会被擦除,但是,为了可以在编译器能够更好的进行类型检测,我们引入了边界。
例子
package com.ray.ch11;
public class Test<T> {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
new SwimAndRunObject(new Person());
// new SwimAndRunObject(new Object());//error
}
}
interface canRun {
}
class RunObject<T extends canRun> {
}
abstract class canSwim {
}
class SwimAndRunObject<T extends canSwim & canRun> {
public SwimAndRunObject(T item) {
}
}
class Person extends canSwim implements canRun {
}
我们仔细观察上面的代码,需要注意的地方有两个:
(1)在main方法里面SwimAndRunObject构造函数只接受canRun或者canSwim这两种类型的对象。由于我们在SwimAndRunObject里面已经给泛型限定了边界,在编译的时候,编译器会进行类型检测,符合的才能够便已通过,因此下面的那个new Object则不行。
(2)边界的定义通过extends标记,而且在多重边界的时候,可以通过“&”来连接。
下面我们修改一下上面的代码,在增加一个live的类,然后其他的类都继承这个live类,而且live类引入泛型T。
package com.ray.ch11;
public class Test<T> {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
new SwimAndRunObject(new Person());
// new SwimAndRunObject(new Object());//error
}
}
class Live<T> {
}
interface canRun {
}
class RunObject<T extends canRun> extends Live<T> {
}
abstract class canSwim {
}
class SwimAndRunObject<T extends canSwim & canRun> extends Live<T> {
public SwimAndRunObject(T item) {
}
}
class Person extends canSwim implements canRun {
}
上面的代码,Live里面的T,其实已经同时加上了边界。
总结:这一章节主要讲述边界的作用。
这一章节就到这里,谢谢。
-----------------------------------