我想有一个通用的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)的实例。
有什么建议吗?
(我理解为什么界面方法不能是静态的;我只是不知道如何优雅地解决这样的问题。)
答案 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();
…
}
}