首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java使用接口作为数据类型

Java使用接口作为数据类型
EN

Stack Overflow用户
提问于 2021-03-28 17:06:58
回答 2查看 57关注 0票数 0

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

例如:

代码语言:javascript
运行
复制
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。而且我没有访问其他功能的权限。

代码语言:javascript
运行
复制
    for (int i = 0; i < this.tracking.size(); i++) {
        System.out.println(this.tracking.get(i));
    }

访问truckID字段的主要问题

如果能解释一下如何解决这个问题,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-28 17:15:01

您可以使用instanceof查找对象的实际类,以便能够使用其特定的方法

代码语言:javascript
运行
复制
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);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-03-28 17:24:50

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

您的问题是为什么特定于van的方法在Node变量中不可用。在编译时,Java编译器不知道什么类型的子类将被分配到Node变量中。假设您有一个像Van一样的Taxi类。因此,可以将Taxi对象分配给Node类。由于此运行时信息对编译器不可用,因此它将确保Node变量只能访问Node特定字段。

如果您知道只能将Van赋值给Node变量,则可以进行显式强制转换。

代码语言:javascript
运行
复制
Van van = (Van) node;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66839856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档