从头认识java-13.10 边界的作用

这一章节我们来讲述一下边界。

之前的章节已经提到,在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,其实已经同时加上了边界。


总结:这一章节主要讲述边界的作用。


这一章节就到这里,谢谢。

-----------------------------------

目录


你可能感兴趣的:(java)