簡體   English   中英

Java、generics 和 static 方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM