相同 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;
必须在我的代码中出现在其他逻辑之前,而且我无法创建一个接口,然后在 Item
和 Truck
中实现该接口。我也根本无法修改 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();
我有类似下面的内容:
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;
必须在我的代码中出现在其他逻辑之前,而且我无法创建一个接口,然后在 Item
和 Truck
中实现该接口。我也根本无法修改 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();