【问题标题】:Java using interface as data typeJava使用接口作为数据类型
【发布时间】:2021-06-24 15:14:33
【问题描述】:

是否可以使用接口对象访问实现接口的类对象的字段或函数?

例如:

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;
    }
}

我尝试从另一个类打印 Tracking 并让节点成为 Van 类的特定函数,但节点只返回 van 函数的 toString。而且我无法使用其他功能。

    for (int i = 0; i < this.tracking.size(); i++) {
        System.out.println(this.tracking.get(i));
    }

访问 truckID 字段的主要问题

我希望能解释一下如何解决这个问题。

【问题讨论】:

  • 当您使用println 时,默认的toString 会被调用,但您可以尝试显式调用另一个方法是

标签: java class interface polymorphism


【解决方案1】:

您可以使用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);
    }
}

【讨论】:

  • 提到他需要cast到特定类型才能使用该类型上的方法。
【解决方案2】:

您在这里使用继承。节点是超类。在您的代码中,您有一个 Node 实例。该 Node 实例可以分配给任何子类变量,例如 Van 对象。

您的问题是为什么在 Node 变量中没有 van 特定的方法。在编译时查看,Java 编译器不会知道将分配给 Node 变量的子类类型。假设您有像 Van 一样的出租车课程。因此,可以将 Taxi 对象分配给 Node 类。由于编译器无法获得此运行时信息,因此它将确保 Node 变量只能访问 Node 特定字段。

如果您知道只有 Van 可以分配给 Node 变量,您可以进行显式转换。

Van van = (Van) node;

然后您可以访问 van 特定的字段或方法。编译器不会在这里抱怨,因为编码器已明确处理类转换,因此责任在于编码器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多