在Java中,是否可以定义一个接口,该接口有一个接收实现类参数的方法?
接口:
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。
在我的项目中,我希望实现以下目标。我正在写一个小游戏,并希望实现某种碰撞检测。基本上我想通过做一些“智能”多态调用来做到这一点。
我定义了一个接口ICollisionReceiver,如下所示:
public interface ICollisionReceiver<T extends IShape> extends IShape {
public boolean collides(T t);
}
我定义了另一个这样的界面:
public interface ICollisionChecker<T extends ICollisionChecker<T>> extends IShape {
public void addCollisionReceiver(ICollisionReceiver<T> receiver);
public void removeCollisionReceiver(ICollisionReceiver<T> receiver);
}
现在我的播放器实现接口ICollisionReceiver,因为播放器接收到冲突并处理它们。这应该以通用的方式完成,所以例如我有盒子和圆圈,现在玩家实现ICollisionReceiver&lt;盒子&gt;和ICollisionReceiver&lt;圈&gt; 所以我有两种方法
@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()方法。
现在重点是,我想确保两个类框和圆圈仅使用自己的类型实现ICollisionChecker接口。
我明确可以通过做这样的事情来做到这一点
public class Bonus extends AnimatedSprite implements ICollisionChecker<Bonus>...
但这对我来说并不是很令人满意......
对于这篇长篇文章感到抱歉,我希望这说清楚。
答案 0 :(得分:27)
您想要的在Java中是不可能的,并且无用。
所以不应该允许这样做:
为什么不呢?这有什么用途?泛型不适合您进行任意限制。泛型只对消除你需要的演员阵容很有用,因为它可以证明演员阵容总是安全的。
只要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) {
}
}
那么就这样吧。你为什么在乎?它会引起什么问题?
答案 1 :(得分:4)
嗯,这至少是可能的:
public interface SelfImplementer<T extends SelfImplementer<T>> {
void method(T self);
}
正如您所看到的,Generic声明看起来有点像无限递归,而且我很确定如果Java 没有有类型擦除,那么 - 谢天谢地(?)所有泛型在编译器处理完它们之后实际上是Objects
所以你可以这样做
public class Impl implements SelfImplementer<Impl> {
@Override
public void method(Impl self) {
System.out.println("Hello!");
}
}
和预期一样,这个
public static void main(String[] args) {
Impl impl = new Impl();
impl.method(impl);
}
打印出来
Hello!
答案 2 :(得分:-1)
你想做的事情可能是这样的:
public interface MyInterface <T extends A> {
public void method(T object) {
...
}
}
public class A implements MyInterface<A_or_class_extending_A>
{ ... }
我希望这有帮助!