在vert.x中几乎所有Verticle都要继承AbstractVerticle这个类,而在这个类的定义中,start()方法的定义只有两种:
// 第一种
/** @deprecated */
@Deprecated
// 用Future<T>作为入参的方法已经被弃用了
public void start(Future<Void> startFuture) throws Exception {
this.start();
startFuture.complete();
}
// 第二种
// 这个是空的
public void start() throws Exception {
}
但很神奇的是有些sampleCode中传一个Promise<T>
类型的参数也不会出问题,我试着单步了一下:
可见由于某些原因这个Promise<T>
类型的参数被自动转换成了Future<T>
类型
哦。我找到了。
AbstractVerticle类中实现了Verticle接口:
public abstract class AbstractVerticle implements Verticle {...}
我忘记了在Java8之后接口类中也可以通过default关键字来对方法进行实现
这个位置夹在两个Deprecated中间是真的考验眼力。而且为什么IDE识别到了这个方法却不能进行跳转= =
点进去可以发现Verticle中通过default实现了start(Promise<Void>)
方法,而且实际上就是把Promise强制类型转成Future = =
感谢itgeekhome的指正,这里应该不算强转
这样就顺便复习一下default关键字:default关键字由Java8引入,通过default就可以完成在接口类中进行方法的实现,实现了default方法的接口依然是接口,这意味着Java中可以通过这种方法完成“多重继承”(如果实现的两个接口中有同名方法会报错,需要手动override)。另外,default方法也是可以被Override的。