相同 instanceof 但不同 class 的方法不可见性

Method nonvisibility of same instanceof but differing class

我有类似下面的内容:

Item var;

根据用户输入,它将被初始化为不同的 class:

if (/*user input*/ == 1) {
    var = new Item();
} else {
    var = new Truck();
}

classes 定义为:

public class Truck extends Item {
    public void someMethod();
    public void exclusiveMethod();
}
public class Item {
    public void someMethod();
}

注意Truck有一个独占方法,exclusiveMethod()Item没有。根据某些条件,将在 var:

上调用一系列方法
// will only return true if var was initialized as Truck
if (/*conditions*/) {
    var.someMethod();
    var.exclusiveMethod();
} else {
    var.someMethod();
}

Netbeans 弹出 exclusiveMethod() 找不到的错误,因为它不在 Item 中。仅当 var 初始化为 Truck 时,我才需要 exclusiveMethod() 的方法可见性。不过,我有一些限制:Item var; 必须在我的代码中出现在其他逻辑之前,而且我无法创建一个接口,然后在 ItemTruck 中实现该接口。我也根本无法修改 public class Item{}

我能做什么?

您可以使用反射 API 调用 exclusiveMethod .

代码看起来像 -

Method m = var.getClass().getMethod("exclusiveMethod", null);
if(m != null) {
    m.invoke(var, null);
}

您可以在此处获取有关反射 API 的更多信息 - http://docs.oracle.com/javase/tutorial/reflect/index.html


另一种方法是将 var 强制转换为 Truck ,前提是您确定 var 是 Truck 类型的对象。示例代码为 -

if(var instanceof Truck) {
    ((Truck)var).exclusiveMethod()
}

根据你的问题,我了解到如果用户输入说 1,那么 var 将被实例化为 Truck,否则它应该被实例化为 Item。该代码是可行的。我觉得你在调用方法 exclusiveMethod() 时遇到问题你可以使用 instanceof 检查实例然后调用方法如下:

if (var instanceof Truck) {
    var.someMethod();
    ((Truck)var).exclusiveMethod();
} else {
    var.someMethod();
}

这是基本的 OOP 多态性。在您的 superclass (Item)中定义一个空的 exclusiveMethod() ,然后在添加一些代码的 Truck 中覆盖它。您不需要任何 if 语句或 class 检查。

public class Item {
    public void someMethod() {
       // do something
    }

    public void exclusiveMethod() {
    }
}

public class Truck extends Item {
    @Override
    public void someMethod() {
       // do something else
    }

    @Override
    public void exclusiveMethod() {
       // implement me
    }
}

...

Item item = getItemOrTruck(...);
item.someMethod();
item.exclusiveMethod();