Я уверен, что на это ответили 100 раз, но я не уверен, что искать. Я хочу создать интерфейс с абстрактным методом, который применяет параметр self-type класса, который его реализует.Как создать интерфейс с абстрактными методами, которые ссылаются на self-type в java
Мусор, это глоток.
Например, у меня есть интерфейс под названием Collider, с методом isColliding. У меня есть класс под названием Player, который реализует Collider. В моем случае использования только объекты одного и того же подтипа Collider должны будут проверить, столкнулись ли они друг с другом. Я хочу, чтобы Player реализовал метод isColliding, но я хочу, чтобы прототип функции выполнялся как isColliding (Player p), а не isColliding (Collider c)
Мне удалось реализовать то, что я считаю работой -around, объявив коллайдер, как
public interface Collider<T extends Collider<T>> {
public abstract boolean isColliding(T other);
}
Но когда я объявляю свой класс, который реализует коллайдер, класс прототип выглядит следующим образом
public class Player implements Collider<Player>
Это кажется уродливым и не обязательно, так как Типобезопасный, как я d нравится. Похоже, должен быть способ сделать это <. Игрок > подразумевается. Моя цель состоит в том, чтобы прототип функции Overridden для дочернего класса выглядел следующим образом:
public boolean isColliding(Player other)
Заранее благодарен!
редактировать:
Чтобы дать немного больше фона:
У меня есть одноэлементный класс под названием Collision, которая регистрирует мои объекты, которые могут конфликтовать друг с другом. Внутри Столкновение у меня есть HashMap объявлен
HashMap<Class, ArrayList<Collider>> colliders
Это моя структура данных для хранения объектов, которые могут конфликтовать друг с другом. Они отображаются по классу, потому что мой дизайн требует, чтобы каждый класс проверял, сталкивается ли он с самим собой. У Collision есть своя функция isColliding, которая вызывается из моих объектов, которые реализуют Collider. Похоже, что этот
public <T extends Collider> boolean isColliding(T c) throws ColliderNotPopulatedException {
ArrayList<T> cList = (ArrayList<T>)colliders.get(c.getClass());
if (cList == null) {
throw new ColliderNotPopulatedException();
}
for (T otherC : cList) {
if (c != otherC && c.isColliding(otherC)) {
return true;
}
}
return false;
}
я получаю ошибки NoSuchMethod, как я пытаюсь вызвать isColliding в этом методе, и я подозреваю, что это потому, что сам-typeness не реализован. Должен ли я передумать мой дизайн? Есть ли узоры, которые сделают это чище?
редактировать 2:
мне удалось пройти ошибку мой кастинг 'otherC' как тип (T) в вызове isColliding. Похоже, эта реализация будет работать для меня. Спасибо всем за вашу помощь!
Классический пример чего-то вроде java.lang.Comparable. Вы считали, что копируете его структуру? –
Я думаю, что это то, что у меня уже есть. Я надеялся, что есть еще одна особенность Java, которую я не замечаю для себя, для себя, вместо того, чтобы я явно предоставлял ее в каждом унаследованном классе. – Michael
Это неточно и избыточно. Вот почему я думаю, что это, вероятно, не лучшее решение. Это моя работа для обеспечения самонастройки в методе isColliding. Это не совсем то, что я хочу, но это более конкретный, чем разрешить любой общий тип. – Michael