Java泛型:接收实现类的类型参数的接口方法

前端之家收集整理的这篇文章主要介绍了Java泛型:接收实现类的类型参数的接口方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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<盒子>和ICollisionReceiver圈>
所以我有两种方法

@Override
public boolean collides(final Box b) {        
    ...
    return false;
}

@Override
public boolean collides(final Circle c) {        
    ...
    return false;
}

在我的框和圆类中,我可以注册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;
    }

这基本上是检查这个盒子是否与某个接收器碰撞,然后调用接收器碰撞()方法.

现在的一点是,我想确保两个类框和圆实现ICollisionChecker接口只有自己的类型.

我明白可以这样做

public class Bonus extends AnimatedSprite implements ICollisionChecker<Bonus>...

但这对我来说不太满意

对不起,长期的帖子,我希望这一点很清楚.

解决方法

你想要的是不可能在Java,并没有用的.

So this should not be allowed:

为什么不?这是什么用途?泛型不是为了任意限制.泛型仅用于消除您将需要的转换,因为它可以证明演员总是安全的.

只要公共类A实现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) {
    }
}

那么就这样你为什么在乎?它造成什么问题?

原文链接:https://www.f2er.com/java/125969.html

猜你在找的Java相关文章