java泛型边界

    上一节我们讲了泛型的类型擦除,为了弥补擦除带来的影响,我们必须协助泛型类,给定泛型类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

猜你喜欢

转载自blog.csdn.net/u013276277/article/details/80857714