在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); }
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)会在编译时为您检查。