相同instanceof但不同类的方法不可见性
Posted
技术标签:
【中文标题】相同instanceof但不同类的方法不可见性【英文标题】:Method nonvisibility of same instanceof but differing class 【发布时间】:2015-08-30 11:31:21 【问题描述】:我有类似下面的内容:
Item var;
根据用户输入,它将被初始化为不同的类:
if (/*user input*/ == 1)
var = new Item();
else
var = new Truck();
类定义为:
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;
必须在其他逻辑之前出现在我的代码中,并且我无法创建一个接口,然后在Item
和Truck
中实现该接口。我也根本无法修改public class Item
。
我能做什么?
【问题讨论】:
请参考Java继承 你不能在Item
上调用Truck
的方法,你必须使用casting。
将包含此 if 语句的代码放入类 Item
的方法中。并且在类Truck
中覆盖该方法并在那里以不同的方式实现它(也称为exclusiveMethod
)。并阅读面向对象编程,这将解释为什么这是正确的方法。
@ErwinBolwidt,我无法修改类Item
:无法添加或编辑。
简单地说,您想有条件地调用其中一个方法 - 按照两个答案中的建议,使用 instanceof
检查您的对象。
【参考方案1】:
您可以使用反射 API 调用 exclusiveMethod
。
代码看起来像 -
Method m = var.getClass().getMethod("exclusiveMethod", null);
if(m != null)
m.invoke(var, null);
您可以在此处获取有关 relfection API 的更多信息 - http://docs.oracle.com/javase/tutorial/reflect/index.html
如果您确定 var 是 Truck
类型的对象,另一种方法是将 var
转换为 Truck
。示例代码是 -
if(var instanceof Truck)
((Truck)var).exclusiveMethod()
【讨论】:
演员选项更好 是的,我只是给出了所有可能的选项。【参考方案2】:这是基本的 OOP 多态性。在您的超类 (Item) 中定义一个空的 ExclusiveMethod(),然后在 Truck 中添加一些代码来覆盖它。您不需要任何 if 语句或类检查。
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();
【讨论】:
【参考方案3】:从你的问题我了解到,如果用户输入是 1,那么 var
将被实例化为 Truck
否则它应该被实例化为 Item
。该代码是可行的。我感觉你调用exclusiveMethod()
方法有问题,你可以使用instanceof
检查实例,然后调用如下方法:
if (var instanceof Truck)
var.someMethod();
((Truck)var).exclusiveMethod();
else
var.someMethod();
【讨论】:
以上是关于相同instanceof但不同类的方法不可见性的主要内容,如果未能解决你的问题,请参考以下文章