当前位置: 首页 > 知识库问答 >
问题:

明确表示类实现接口

夏元明
2023-03-14

在Java和类似的语言中,必须显式地说一个类实现一个接口的真正原因是什么?

想象一下隐式实现:

interface Flyer { void fly(); }

public class Duck { public void fly() {...} }

public class Plane { public void fly() {...} }

public class Hoe { void hangAround() {...} }

void startFlying(Flyer flyer) {...}

void race() {
    ...
    startFlying(duck);  // OK
    startFlying(plane); // OK
    startFlying(hoe);   // Compilation error.
}
interface Runner { void run(); }

public class Guy { public void run(); }
public class Gal { public void run(); }

void startRunning(Runner r) {...}

void race() {
    startRunning(guy);            // OK
    startRunning(gal);            // OK
    startRunning(runnableThread); // OK
}
public class Guy **implements Runner **{ public void run(); }
public class Gal **implements Runner **{ public void run(); }

粗体(或**和**之间的文字)是你必须付出的代价

void race() {
    startRunning(guy);            // OK
    startRunning(gal);            // OK
    startRunning(runnableThread); // Compilation error!
}

注意编译错误,以便在测试前看到问题。

如果打算在startRunning()中也使用runnableThread,则必须更加明确地执行(有足够的时间来意识到您在做什么)。

public class Airbus {
    void takeOff() {...}
    void land() {...}
    Passenger[] getPassengers() {...}
}

public class Ladybug {
    void takeOff() {...}
    void land() {...}
}
public class Duck {
    void takeOff() {...}
    void land() {...}
    Passenger[] getPassengers() {...}
}

public interface Aircraft {
    void takeOff();
    void land();
    Passenger[] getPassengers();
}

public void fly(Aircraft aircraft) {
    aircraft.takeOff();
    for (Passenger p : aircraft.getPassengers()) {...}
    aircraft.land();
}

public void airport() {
    fly(airbus_a380); // OK
    fly(ladybug);     // Compilation error, does not match Aircraft requirements.
    fly(duck);        // OK
}

public interface Lander {
    void land();
}

public void landAtMeadow(Lander lander) {...}

public void meadow() {
    landAtMeadow(airbus_a380); // OK
    landAtMeadow(duck);        // OK
    landAtMeadow(ladybug);     // OK
}
public interface Lander { void landAtLimitedArea(int size); }

共有1个答案

范豪
2023-03-14

Java是一种强类型化语言,因此必须在编译时验证将实例分配给接口类型化变量。这只能通过显式声明的接口实现来完成。

 类似资料:
  • 问题内容: 我有一个对象。我想确定对象表示的类型是否实现特定的接口。我想知道如何实现? 我有以下代码。基本上,它所做的是获取指定包中所有类的数组。然后,我想遍历数组并将添加实现接口的Class对象添加到我的地图。问题是将一个对象作为参数。我无法实例化接口。所以我对此感到茫然。有任何想法吗? 问题答案: 您应该使用:

  • 我有一个对象。我想确定对象表示的类型是否实现了特定的接口。我想知道这是如何实现的? 我有以下代码。基本上,它所做的是获取指定包中所有类的数组。然后,我想遍历数组并将实现接口的类对象添加到映射中。问题在于将对象作为参数。我无法实例化接口。所以我有点不知所措。有什么想法吗?

  • 问题内容: 首先,我阅读了埃里克森对“为什么不能在Java接口中定义静态方法?”的有用答复。。这个问题不是关于“为什么”的问题,而是关于“然后如何做”的问题。 编辑:我的原始示例不适当地,但我将其保留在下面。 虽然我现在确信在大多数情况下我想做的是过度矫kill过正,但在一种情况下可能需要这样做: 我再举一个例子。现在,让我们采用一个适合于查找表的复杂功能,例如Bessel函数。这必须进行初始化,

  • 本文向大家介绍C++实现图的邻接矩阵表示,包括了C++实现图的邻接矩阵表示的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现图的邻接矩阵表示代码,供大家参考,具体内容如下 1.遇到的问题:教材中写着子类Graphmtx(我用GrapMatrix)继承基类Graph 但是我在子类GraphMatrix中使用父类Graph的保护成员属性:maxVertices 显示没有声明(如下

  • 我是DSA的初学者,最近几天我一直在尝试使用邻接列表找到图形的正确实现。 下面我给出了我认为邻接列表是如何实现的整个代码。 我从头开始创建了一个SiinglyLinkedlist。并且我正在使用一个Hashmap来改进时间复杂性。 Hashmap中的整数键充当顶点&在其值中包含一个Linkedlist。 在顶点中,我存储了整数ID,在Linkedlist中,我存储了该ID的所有好友名。 图中有3种

  • 问题内容: 如何确保类型在编译时实现接口?这样做的典型方法是失败地分配该类型的支持接口,但是我有几种类型只能动态转换。在运行时,这会生成非常粗糙的错误消息,而没有给出针对编译时错误的更好诊断。在运行时发现我期望支持接口的类型也很不方便,实际上却不支持。 问题答案: 假设问题是关于围棋的,例如 因为顶级域名(TLD)会在编译时为您检查。