2011-08-10 78 views
3

我想有能的實現插補接口的類實例之間插入一個通用插補類:Java中,泛型和靜態方法

interface Interpolatable { 
    int getDimension(); 
    Iterator <? extends Interpolatable> getIterator(double d); 
} 

class Coordinate extends AnotherClass implements Interpolatable { 
    public int getDimension() {return 3;} 
    public Iterator <Coordinate> getIterator (double d) {…} 
} 

class Interpolator <T extends Interpolatable> { 
    Interpolator() { 
    int dim = T.getDimension(); 
    } 
    void doSomething (double d) { 
    Iterator <? extends Interpolatable> it = T.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
} 

當然,編譯器會抱怨T.getDimension()T.getIterator(d)

無法從Interpolatable類型對非靜態方法getDimension()/ getIterator(double)進行靜態引用。

但是,這兩種方法不能做成靜態的,因爲它們是在一個接口中定義的。當時我會在Interpolator中使用它們,但我沒有可用的Coordinate(或任何Interpolatable)實例。

有什麼建議嗎?

(我明白爲什麼接口方法不能是靜態的,我只是缺少一個想法如何優雅地解決這樣的問題。)

+1

沒有你的代碼使用'static'關鍵字 - 你可以檢查你已經正確發佈你的代碼? – Bohemian

+0

@Bohemian他從類型(類)本身(例如,T.getDimension())使用方法.getIterator或.getDimension,而不是來自實例。 – SJuan76

回答

4

由於類型擦除,您不能在運行時使用泛型類型。你需要保持一個實例或類對象周圍:

class Interpolator <T extends Interpolatable> { 
    private final T target; 

    Interpolator (T target) { 
    this.target = target; 
    int dim = target.getDimension(); 
    } 
    void doSomething (double d) { 
    Iterator <? extends Interpolatable> it = target.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
} 
+0

+1恕我直言這種方法是最簡單和最乾淨的 - 它只需要構造函數中的一個額外參數,並且可以使用非公有構造函數將其隱藏起來,這樣乾淨的API。其他方法需要方法中的虛擬實例參數... yuk。 – Bohemian

0

不能你說class Interpolator extends Coordinate

,然後只需調用該方法,立竿見影。 ..

+0

不,因爲另一次,我想插入除座標之外的東西。 –

4

基本上,你永遠傳遞接口的任何實例類。你只是使用調用類型(類),v.g. T.getDimension();

此外,您根本不需要泛型。普通的舊接口按照你想要的方式工作。

你可以這樣做:

class Interpolator { 
    Interpolable interpolable = null; 
    Interpolator (Interpolable _interpolable) { 
    this.interpolable = _interpolable; 
    } 

    void doSomething (double d) { 
    Iterator<Interpolable> it = this.interpolable.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
} 

我建議進入你的工作更用來連接,靜態/實例方法和其他更基本的東西,仿製藥......

0

之前,我想你」簡單地過度使用泛型。這應該工作:

class Interpolator { 
    Interpolatable myInterpolatable; 

    Interpolator (Interpolatable i) { 
    myInterpolatable = i; 
    int dim = i.getDimension(); 
    } 
    void doSomething (double d) { 
    Iterator <Interpolatable> it = myInterpolatable.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
}