这一章节我们来讲述一下边界。
之前的章节已经提到,在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 { }
总结:这一章节主要讲述边界的作用。
这一章节就到这里,谢谢。
-----------------------------------
目录