java泛型邊界
阿新 • • 發佈:2019-01-29
上一節我們講了泛型的型別擦除,為了彌補擦除帶來的影響,我們必須協助泛型類,給定泛型類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