java 没有强转,但是实现类的方法照样运行了,这是怎么回事呀?

java 没有强转,但是实现类的方法照样运行了,这是怎么回事呀?

先看代码:
ExecutorService s = Executors.newFixedThreadPool(10);
Test t = new Test();//这是一个实现了Callable接口的类
s.submit(t);

这时候s的类型是ExecutorService,它是一个接口,源码中submit()并没有被实现,但是此时的程序却可以运行,结果也没问题。
不是必须强转才能使用子类的方法吗?但是我没强转照样可以运行,看了一个小时还不理解,不知道怎么回事*~*

这里需要注意一点,强转才能使用子类的方法,前提是子类在父类的基础上新增了方法,你需要使用这个新增的方法,那你父类肯定是没有该方法,所以不能使用,需要强转到子类。但是如果子类的方法,父类也有就不需要强转,子类会去重写该方法。就如这里的ExecutorService 他是有submit所以可以直接使用

回答:这涉及创建函数时具体创建的对象,你实际上创建的是 ThreadPoolExecutor 对象,而 ThreadPoolExecutor是 AbstractExecutorService的子类,AbstractExecutorService实现了 ExecutorService接口,且对 submit方法有默认实现,当然在子类也有重写,所以实际上 s.submit(t); 调用的是 AbstractExecutorService里面的方法,可以追一下源码,或者通过Debug进行查看

img