Java 使用接口作为数据类型
Java using interface as data type
是否可以访问使用接口对象实现接口的class对象的字段或函数?
例如:
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;
}
}
并且从另一个 class 我尝试打印 Tracking 并从 Van class 获取节点作为特定函数,但节点 return 仅是 van 函数的 toString。而且我无法访问其他功能。
for (int i = 0; i < this.tracking.size(); i++) {
System.out.println(this.tracking.get(i));
}
访问truckID字段的主要问题
如果能解释一下如何解决这个问题,我将不胜感激。
你可以使用instanceof
找到真正的class对象,才能使用它的特定方法
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);
}
}
您在这里使用了继承。节点是超级class。在您的代码中,您有一个 Node 实例。该 Node 实例可以分配给任何 subclass 变量,如 Van 对象。
您的问题是为什么 van 特定方法在 Node 变量中不可用。在编译时看到,Java 编译器不知道什么类型的 subclass 将被分配到 Node 变量中。假设你有一辆出租车 class 就像货车一样。所以一个 Taxi 对象可以分配给 Node class。由于此运行时信息对编译器不可用,因此它将确保 Node 变量只能访问 Node 特定字段。
如果您知道只能将 Van 赋值给 Node 变量,则可以进行显式转换。
Van van = (Van) node;
然后您可以访问范特定的字段或方法。编译器不会在这里抱怨,因为编码器已经明确地处理了 class 转换,所以责任在于编码器。
是否可以访问使用接口对象实现接口的class对象的字段或函数?
例如:
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;
}
}
并且从另一个 class 我尝试打印 Tracking 并从 Van class 获取节点作为特定函数,但节点 return 仅是 van 函数的 toString。而且我无法访问其他功能。
for (int i = 0; i < this.tracking.size(); i++) {
System.out.println(this.tracking.get(i));
}
访问truckID字段的主要问题
如果能解释一下如何解决这个问题,我将不胜感激。
你可以使用instanceof
找到真正的class对象,才能使用它的特定方法
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);
}
}
您在这里使用了继承。节点是超级class。在您的代码中,您有一个 Node 实例。该 Node 实例可以分配给任何 subclass 变量,如 Van 对象。
您的问题是为什么 van 特定方法在 Node 变量中不可用。在编译时看到,Java 编译器不知道什么类型的 subclass 将被分配到 Node 变量中。假设你有一辆出租车 class 就像货车一样。所以一个 Taxi 对象可以分配给 Node class。由于此运行时信息对编译器不可用,因此它将确保 Node 变量只能访问 Node 特定字段。
如果您知道只能将 Van 赋值给 Node 变量,则可以进行显式转换。
Van van = (Van) node;
然后您可以访问范特定的字段或方法。编译器不会在这里抱怨,因为编码器已经明确地处理了 class 转换,所以责任在于编码器。