In Java ist es möglich, eine Schnittstelle zu definieren, die eine Methode hat, die ein Argument der implementierenden Klasse erhält?Java Generics: Interface-Methode, die Typ Argument der implementierenden Klasse
Schnittstelle:
public interface MyInterface {
public <T is/extends of the type of the implementing class> void method(T object);
}
Klasse:
public class A implements MyInterface {
public void method(A object) {
...
}
}
Was ich vermeiden möchte, ist, dass eine Klasse MyInterface mit einer anderen Klasse wie selbst implementieren könnte.
So sollte dies nicht zulässig:
public class A implements MyInterface<B> {
public void method(B object) {
...
}
}
Edit:
Ok ich versuche, auf eine andere Weise zu beschreiben, was ich erreichen will . Ich möchte mehrere Klassen haben, die eine Methode haben, die ein arg dieser Art von Klasse akzeptiert. So zusätzlich zu Klasse A können von oben sagen Theres eine andere Klasse B, die wie folgt aussieht:
public class B implements MyInterface {
public void method(B object) {
...
}
}
welchen Stand die Klassen A und B gemeinsam haben, ist ein Verfahren, „Methode“ genannt, die eine arg von der Art des erhält Klasse selbst.
In meinem Projekt möchte ich Folgendes erreichen. Ich schreibe ein kleines Spiel und möchte eine Art Kollisionserkennung implementieren. im Grunde möchte ich dies tun, indem ich einige "intelligente" polymorphistische Aufrufe mache.
ich eine Schnittstelle ICollisionReceiver definiert, die wie folgt aussieht:
public interface ICollisionReceiver<T extends IShape> extends IShape {
public boolean collides(T t);
}
und ich definiert eine weitere Schnittstelle wie folgt aus:
public interface ICollisionChecker<T extends ICollisionChecker<T>> extends IShape {
public void addCollisionReceiver(ICollisionReceiver<T> receiver);
public void removeCollisionReceiver(ICollisionReceiver<T> receiver);
}
Jetzt zum Beispiel mein Player implementiert die Schnittstelle ICollisionReceiver als der Spieler erhält Kollisionen und behandelt sie. Dies sollte in allgemeiner Weise durchgeführt werden, so zum Beispiel I-Boxen und Kreis haben, jetzt die Spieler implementiert ICollisionReceiver < Box> und ICollisionReceiver < Kreis> so habe ich beide Methoden
@Override
public boolean collides(final Box b) {
...
return false;
}
und
@Override
public boolean collides(final Circle c) {
...
return false;
}
in meiner Box und Kreisklasse kann ich ICollisionReceivers registrieren und dann die folgenden in der Update-Methode, die ich tun:
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;
}
Dies prüft im Grunde, ob diese Box mit einem bestimmten Empfänger kollidiert und ruft dann die Methode collides() des Empfängers auf.
Jetzt ist der Punkt, ich möchte sicherstellen, dass beide Klassen Box und Kreis implementieren die ICollisionChecker-Schnittstelle nur mit ihrem eigenen Typ.
Ich kann dies explizit tun, indem Sie so etwas wie diese
public class Bonus extends AnimatedSprite implements ICollisionChecker<Bonus>...
aber das ist nicht sehr befriedigend für mich tun ...
Sorry für den langen Post, ich hoffe das es deutlich macht.
'public void-Methode (T-Objekt);' ist keine Option? denn wenn ich ehrlich bin, habe ich nicht verstanden, was du erreichen willst. –
Zhedar