[英]Java, generics and static methods
我想要一個通用的插值器 class 可以在實現 Interpolatable 接口的類的實例之間進行插值:
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) 進行 static 引用。
但是,這兩種方法不能做成static,因為它們是在一個接口中定義的。 而且當時我將在插值器中使用它們,我沒有可用的坐標(或任何插值)實例。
有什么建議么?
(我明白為什么接口方法不能是 static;我只是不知道如何優雅地解決這樣的問題。)
由於類型擦除,您無法在運行時對泛型類型做太多事情。 您需要保留一個實例或 class object :
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();
…
}
}
基本上,您永遠不會將接口的任何實例傳遞給 class 。 您只是在調用類型(類),vg T.getDimension();
此外,您根本不需要 generics 。 普通的舊界面可以按照您想要的方式工作。
你可以這樣做:
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();
…
}
}
我建議在進入 generics 之前,您應該更習慣於接口、靜態/實例方法和其他更基本的東西......
你不能說class Interpolator extends Coordinate
然后直接調用該方法...
我認為您只是過度使用 generics。 這應該有效:
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();
…
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.