Java,泛型和静态方法

时间:2011-08-10 10:52:25

标签: java generics interface static

我想有一个通用的Interpolator类,可以在实现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)进行静态引用。

但是,这两种方法不能成为静态的,因为它们是在接口中定义的。当我在Interpolator中使用它们时,我没有Coordinate(或任何Interpolatable)的实例。

有什么建议吗?

(我理解为什么界面方法不能是静态的;我只是不知道如何优雅地解决这样的问题。)

4 个答案:

答案 0 :(得分: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();
    …
  }
}

答案 1 :(得分: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();
    …
  }
}

我建议在进入泛型之前,你更多地使用接口,静态/实例方法和其他更基本的东西......

答案 2 :(得分:0)

你不能说class Interpolator extends Coordinate

然后立即调用该方法......

答案 3 :(得分: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();
    …
  }
}