【发布时间】:2016-01-31 18:43:56
【问题描述】:
我确定这已被回答 100 次,但我不确定要搜索什么。 我想创建一个带有抽象方法的接口,该方法强制实现它的类的自类型参数。
嗬嗬嗬嗬。
例如,我有一个名为 Collider 的接口,带有一个名为 isColliding 的方法。我有一个名为 Player 的类,它实现了 Collider。在我的用例中,只有 Collider 相同子类型的对象需要检查它们是否相互碰撞。我希望 Player 实现方法 isColliding,但我希望函数原型被强制执行为 isColliding(Player p),而不是 isColliding(Collider c)
通过将 Collider 声明为
,我设法实现了我认为的解决方法public interface Collider<T extends Collider<T>> {
public abstract boolean isColliding(T other);
}
但是当我声明实现碰撞器的类时,类原型看起来像这样
public class Player implements Collider<Player>
这看起来很难看,而且不一定像我想要的那样类型安全。似乎应该有一种方法可以使
public boolean isColliding(Player other)
提前致谢!
编辑:
提供更多背景知识:
我有一个名为 Collision 的单例类,它注册我的可能相互碰撞的对象。在 Collision 内部,我有一个声明为
的 HashmapHashMap<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;
}
当我尝试在此方法中调用 isColliding 时遇到 NoSuchMethod 错误,我怀疑这是因为未实现自类型。我应该重新考虑我的设计吗?有没有模式可以让这个更干净?
编辑 2:
我设法克服了在调用 isColliding 时将“otherC”转换为类型 (T) 的错误。看来这个实现对我有用。感谢大家的帮助!
【问题讨论】:
-
这样的经典例子是 java.lang.Comparable。你考虑过复制它的结构吗?
-
我认为这就是我已经拥有的。我希望我忽略了 Java 的另一个特性来为我找出自我类型,而不是我自己在每个继承的类中明确提供它
-
这是不精确和多余的。这就是为什么我认为这可能不是最好的解决方案。这是我在 isColliding 方法中强制执行 self 类型的解决方法。这不是我想要的,但它比允许任何泛型类型更具体。
-
泛型类型中的自键入可能会成为困难的来源。如果它是您真正需要的,那么就是这样,但有时有一些优雅的解决方案可以避免自键入。
-
这意味着什么?它的难度细节是什么?
标签: java generics methods abstract self-reference