1. 程式人生 > >java泛型邊界

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