上一节我们讲了泛型的类型擦除,为了弥补擦除带来的影响,我们必须协助泛型类,给定泛型类ide边界,以此告知编译器只能接受遵循这个边界的类型。这里需要重用了extends关键字。
class Student<T extends People>
泛型类型参数将擦除到她的第一个边界(她可能会有多个边界,稍后你就会看到)。编译器实际上会把类型参数替换为她的擦除,就像上面的示例一样,T擦除People,就好像在类的声明中用People代替T一样。
边界使得你可以在用于泛型的参数类型上设置限制条件,尽管这使得你可以强制规定泛型可以应用的类型,但是其潜在一个更重要的效果是你可以按照自己的边界来调用方法。因为擦除移除了类型信息,所以,可以用无界泛型参数条用的方法只是那些可以用object调用的方法。但是,如果能够将这个参数限制为某个类型子集,那么你就可以用这些类型子集来调用方法。为了执行这种限制,Java泛型重用了extends关键字。
package com.zy.test;
import java.awt.Color;
public class BasicBounds {
public static void main(String[] args) {
Solid<Bounded> solid = new Solid<Bounded>(new Bounded());
System.out.println(solid.color());
System.out.println(solid.getY());
System.out.println(solid.weight());
}
}
interface HasColor {
java.awt.Color getColor();
}
class Colored<T extends HasColor> {
T item;
Colored(T item) {
this.item = item;
}
T getItem() {
return item;
}
java.awt.Color color() {
return item.getColor();
}
}
class Dimension {
public int x, y, z;
}
class ColoredDimension<T extends Dimension & HasColor> {// 类和接口都是放进来
T item;
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
ColoredDimension(T item) {
this.item = item;
}
java.awt.Color color() {
return item.getColor();
}
int getX() {
return item.x;
}
int getY() {
return item.y;
}
int getZ() {
return item.z;
}
}
interface Weight {
int weight();
}
class Solid<T extends Dimension & HasColor & Weight> {
T item;
Solid(T item) {
this.item = item;
}
public T getItem() {
return item;
}
java.awt.Color color() {
return item.getColor();
}
int getX() {
return item.x;
}
int getY() {
return item.y;
}
int getZ() {
return item.z;
}
int weight() {
return item.weight();
}
}
class Bounded extends Dimension implements HasColor, Weight {
@Override
public int weight() {
return 0;
}
@Override
public Color getColor() {
return null;
}
}
输出结果;
null
0
0