在Java中,是否可以定义一个接口(interface),该接口(interface)具有一个接收实现类参数的方法?
界面:
public interface MyInterface {
public <T is/extends of the type of the implementing class> void method(T object);
}
类:
public class A implements MyInterface {
public void method(A object) {
...
}
}
我要避免的是,一个类可以用另一个像它自己的类来实现 MyInterface。
所以这是不允许的:
public class A implements MyInterface<B> {
public void method(B object) {
...
}
}
编辑:
好的,我尝试用另一种方式描述我想要实现的目标。我希望有几个类具有接受该类类型的 arg 的方法。因此,除了上面的 A 类之外,我们可以说还有另一个 B 类,看起来像这样:
public class B implements MyInterface {
public void method(B object) {
...
}
}
展位类 A 和 B 的共同点是一个称为“方法”的方法,它接收类本身类型的 arg。
在我的项目中,我想实现以下目标。我在写一个小游戏,想实现某种碰撞检测。基本上我想通过做一些“智能”多态调用来做到这一点。
我定义了一个接口(interface) ICollisionReceiver,如下所示:
public interface ICollisionReceiver<T extends IShape> extends IShape {
public boolean collides(T t);
}
我定义了另一个这样的接口(interface):
public interface ICollisionChecker<T extends ICollisionChecker<T>> extends IShape {
public void addCollisionReceiver(ICollisionReceiver<T> receiver);
public void removeCollisionReceiver(ICollisionReceiver<T> receiver);
}
例如,现在我的播放器在接收碰撞并处理它们时实现接口(interface) ICollisionReceiver。这应该以通用方式完成,例如我有盒子和圆圈,现在播放器实现 ICollisionReceiver < Box > 和 ICollisionReceiver < Circle > 所以我有两种方法
@Override
public boolean collides(final Box b) {
...
return false;
}
和
@Override
public boolean collides(final Circle c) {
...
return false;
}
在我的 box 和 circle 类中,我可以注册 ICollisionReceivers,然后在更新方法中执行以下操作:
boolean conti = true;
int i=0;
while(conti && i<collisionReceivers.size()) {
final ICollisionReceiver<Bonus> rec = collisionReceivers.get(i);
if(this.collidesWith(rec)) {
conti = rec.collides(this);
}
++i;
}
这主要是检查此框是否与某个接收器发生碰撞,然后调用接收器的 collides() 方法。
现在的重点是,我要确保 box 和 circle 类都仅使用自己的类型实现 ICollisionChecker 接口(interface)。
我明确地可以通过这样做来做到这一点
public class Bonus extends AnimatedSprite implements ICollisionChecker<Bonus>...
但这对我来说不是很满意......
抱歉,这篇文章太长了,我希望这能让你清楚。
最佳答案
你想要的东西在 Java 中是不可能的,而且没用。
So this should not be allowed:
为什么不呢?那有什么用?泛型不是为你做出任意限制的。泛型仅对消除您原本需要的强制转换有用,因为它可以证明强制转换始终是安全的。
只要 public class A implements MyInterface<B>
是类型安全的,没有必要进行任意限制来禁止它。
你应该简单地将你的界面定义为
public interface MyInterface<T> {
public void method(T object);
}
你可以定义你的类
public class A implements MyInterface<A> {
public void method(A object) {
}
}
如果其他人定义了一个类
public class B implements MyInterface<A> {
public void method(A object) {
}
}
那就这样吧。你为什么在乎?会导致什么问题?
关于Java 泛型 : interface method that receives type argument of implementing class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14665499/