是否可以访问使用接口对象实现接口的类对象的字段或函数?
例如:
public interface Node { // reference to all my trucks
void collect(Package p);
void deliver(Package p);
void work();
}
public class Truck implements Node{...}
public class Van extends Truck {...}
public class Tracking {
private Node node;
@Override
public String toString() {
return "time:" + time + " " + node + ", status=" + status;
}
}
在另一个类中,我尝试打印跟踪并将节点从Van类中获取为特定的函数,但是节点只返回van函数的toString。而且我没有访问其他功能的权限。
for (int i = 0; i < this.tracking.size(); i++) {
System.out.println(this.tracking.get(i));
}
访问truckID字段的主要问题
如果能解释一下如何解决这个问题,我将不胜感激。
发布于 2021-03-28 17:15:01
您可以使用instanceof
查找对象的实际类,以便能够使用其特定的方法
for (Tracking track : this.tracking) {
if (track instanceof Van){
Van v = (Van) track;
v.methodOfVan();
System.out.println(v.truckID);
}
else if (track instanceof Truck ){ // For any other Truck that isn't Van
Truck t = (Truck) track;
t.methodOfTruck();
System.out.println(t.truckID);
}
}
发布于 2021-03-28 17:24:50
您在这里使用了继承。Node是超类。在你的代码中,你有一个Node实例。该节点实例可以被赋值给任何子类变量,比如Van对象。
您的问题是为什么特定于van的方法在Node变量中不可用。在编译时,Java编译器不知道什么类型的子类将被分配到Node变量中。假设您有一个像Van一样的Taxi类。因此,可以将Taxi对象分配给Node类。由于此运行时信息对编译器不可用,因此它将确保Node变量只能访问Node特定字段。
如果您知道只能将Van赋值给Node变量,则可以进行显式强制转换。
Van van = (Van) node;
然后,您可以访问van特定的字段或方法。编译器在这里不会抱怨,因为编码器已经显式地处理了类的类型转换,所以责任在于编码器。
https://stackoverflow.com/questions/66839856
复制相似问题