In Java, è possibile definire un'interfaccia con un metodo che riceve un argomento della classe di implementazione?Java Generics: metodo di interfaccia che riceve l'argomento di tipo della classe di implementazione
interfaccia:
public interface MyInterface {
public <T is/extends of the type of the implementing class> void method(T object);
}
classe:
public class A implements MyInterface {
public void method(A object) {
...
}
}
Quello che voglio evitare è che una classe potrebbe implementare MyInterface con un'altra classe come se stesso.
Quindi questo non dovrebbe essere consentito:
public class A implements MyInterface<B> {
public void method(B object) {
...
}
}
Edit:
Ok provo a descrivere in altro modo ciò che voglio raggiungere . Voglio avere diverse classi che hanno un metodo che accetta un argomento di quel tipo di classe. Quindi, in aggiunta alla classe A dall'alto Diciamo C'è un'altra classe B che assomiglia a questo:
public class B implements MyInterface {
public void method(B object) {
...
}
}
quello stand classi A e B hanno in comune è un metodo chiamato "metodo" che riceve un ARG del tipo di classe stessa.
Nel mio progetto voglio raggiungere il seguente. Sto scrivendo un piccolo gioco e voglio implementare una sorta di rilevamento delle collisioni. fondamentalmente voglio farlo facendo alcune chiamate polimorfiche "intelligenti".
ho definito un ICollisionReceiver un'interfaccia che assomiglia a questo:
public interface ICollisionReceiver<T extends IShape> extends IShape {
public boolean collides(T t);
}
e ho definito un'altra interfaccia come questa:
public interface ICollisionChecker<T extends ICollisionChecker<T>> extends IShape {
public void addCollisionReceiver(ICollisionReceiver<T> receiver);
public void removeCollisionReceiver(ICollisionReceiver<T> receiver);
}
Ora, per esempio, il mio lettore implementa l'interfaccia ICollisionReceiver come il giocatore riceve collisioni e li gestisce. Questo dovrebbe essere fatto in modo generico, così per esempio ho scatole e cerchio, ora il giocatore implementa ICollisionReceiver < Box> e ICollisionReceiver < Circle> così ho entrambi i metodi
@Override
public boolean collides(final Box b) {
...
return false;
}
e
@Override
public boolean collides(final Circle c) {
...
return false;
}
nella mia casella e la classe cerchio posso registrare ICollisionReceivers e poi faccio la seguente nel metodo di aggiornamento:
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;
}
controlla sostanzialmente se questa scatola si scontra con un determinato ricevitore e quindi chiama il metodo collides() dei ricevitori.
Ora il punto è, voglio assicurarmi che entrambe le classi box e circle implementino l'interfaccia ICollisionChecker solo con il loro tipo.
ho esplicitamente possibile farlo facendo qualcosa di simile
public class Bonus extends AnimatedSprite implements ICollisionChecker<Bonus>...
ma questo non è molto soddisfacente per me ...
Ci scusiamo per il lungo post, spero che questo rende evidente.
'public metodo void (oggetto T);' non è un'opzione? poiché se sono onesto non ho capito cosa vuoi ottenere. –
Zhedar