我如何判断一个类是否等于或继承另一个类(Java)

3

我正在编写一个Minecraft模组,成功添加了一个手枪,它与许多支持类一起处理光线追踪、声音和GUI叠加等事项。虽然手枪完美运作,但我想添加支持其他模组使用我的武器类作为基础类来添加他们自己的武器。我的问题是如何让我的支持类知道一个物品类是否实际上是扩展了我的武器类的自定义类。基本上,我需要能够判断一个类的实例是否可以强制转换为我的武器类,以便使用我的武器的基础数据和功能进行处理(请注意,我得到的是一个Item类的实例,而我的WeponItem类扩展了它)。有人知道一个好的方法吗?


当我们想要检查类实例时,使用instanceof总是受欢迎的。因此,您可以使用if(object instanceof yourCheckInstance calss) - Janny
我在想你是否真的在询问(或者很快会询问)“如何找到所有当前类路径下属于我的类的子类型?” - Ryan Ransford
1
有些讨论认为,为什么你需要使用instanceof呢?难道你要检查世界上所有的对象是否都是你基类的实例吗? - Richard Tingle
7个回答

4
if(object instanceof SomeClass)

4

3
你可以使用instanceof来检查你的类型。
下面的例子可能会帮助你。
class InstanceofDemo {
public static void main(String[] args) {

    Parent obj1 = new Parent();
    Parent obj2 = new Child();

    System.out.println("obj1 instanceof Parent: "
        + (obj1 instanceof Parent));
    System.out.println("obj1 instanceof Child: "
        + (obj1 instanceof Child));
    System.out.println("obj1 instanceof MyInterface: "
        + (obj1 instanceof MyInterface));
    System.out.println("obj2 instanceof Parent: "
        + (obj2 instanceof Parent));
    System.out.println("obj2 instanceof Child: "
        + (obj2 instanceof Child));
    System.out.println("obj2 instanceof MyInterface: "
        + (obj2 instanceof MyInterface));
}
}

class Parent {}
class Child extends Parent implements MyInterface {}
interface MyInterface {}

Output:

obj1 instanceof Parent: true
obj1 instanceof Child: false
obj1 instanceof MyInterface: false
obj2 instanceof Parent: true
obj2 instanceof Child: true
obj2 instanceof MyInterface: true

参考文献中的示例。


3

instanceOf可以帮助您完成这个技巧。

if(yourObject instanceof OtherClass)

如果你有一个未知类的对象,你也可以在该对象上使用.getClass()来找出它的类。你也可以像这样比较两个对象:

if(yourObject instanceof OtherObject)

还有一些其他需要注意的事情:http://www.javapractices.com/topic/TopicAction.do?Id=31


2
您可以检查类是否是您的基类的实例:
if (objA instanceof baseObj){

// objA is instance of baseObj

}

1
你可以像这样做。
Pistol  pistol  = new Pistol ();

if(pistol instanceof Weapon )

1

仅供参考:你真的不应该那样做。相反,你应该定义一个名为Weapon的接口,所有武器都必须实现该接口,并且包含程序所需的所有方法。


抽象类和接口是不同情况下适用的合适技术。 - Richard Tingle
1
真的,但如果您需要使用instanceof,则通常是一个大问题的标志。但由于这是一个Minecraft模组,可能存在特殊限制需要使用它。 - MTilsted
我有些不确定为什么 instanceof 甚至是必要的,也同意适当使用很少,但如果抽象类版本需要,接口仍然可能需要一个 instanceof 检查。 - Richard Tingle
1
虽然几乎所有的instanceof检查都可以在一个丰富的对象模型中被强制转换为多态行为,但并不总是情况如此,因为你可能无法完全控制你正在使用/从中工作的继承层次结构。在这些情况下,instanceof仍然是必要的。 - Ryan Ransford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接