Java中能否调用未实现的接口方法?代码求助
首先直接给结论:你不能直接调用没有实现的接口抽象方法,但你代码里的情况其实是调用了接口实现类的具体方法,只是通过接口类型的变量来调用的。
具体解释:
Java里的接口抽象方法(没有default/static修饰的方法)本身确实没有实现逻辑,但在你的Parallel类代码中:
public final class Parallel { public static <T> T For(int start, int end, ParallelForDelegate<T> delegate, T input) { T res = null; for (int i = start; i < end; i++) { res = delegate.combineResults(res, delegate.doSomething(i, input)); // 这里省略了部分代码,但核心是调用delegate的方法 } return res; } }
这里的delegate是ParallelForDelegate<T>类型的参数,它并不是接口本身,而是一个实现了该接口的类的实例对象——在调用Parallel.For方法的时候,肯定传入了一个具体的实现类对象(比如自定义的某个类,实现了ParallelForDelegate接口的combineResults和另一个d开头的方法)。
这是Java的多态特性:接口类型的变量可以指向任何实现该接口的类的对象,当你调用delegate.combineResults(...)时,JVM会动态找到该对象所属类的具体实现方法并执行,而不是调用接口里的空方法。
举个简单的例子辅助理解:
假设你的ParallelForDelegate接口定义是这样的:
public interface ParallelForDelegate<T> { // 你代码里调用的combineResults方法 T combineResults(T previousResult, T currentResult); // 另一个d开头的方法,比如doTask T doTask(int index, T input); }
那一定会有一个类来实现这个接口,比如处理整数累加的实现类:
public class IntSumDelegate implements ParallelForDelegate<Integer> { @Override public Integer combineResults(Integer previous, Integer current) { return previous == null ? current : previous + current; } @Override public Integer doTask(int index, Integer input) { return input + index; } }
然后调用Parallel.For的时候,会传入这个实现类的实例:
Integer sum = Parallel.For(0, 5, new IntSumDelegate(), 10);
此时delegate.combineResults调用的就是IntSumDelegate里写的累加逻辑,完全是有具体实现的。
额外补充:
如果接口里的方法是default修饰的默认方法,或者static修饰的静态方法,那即使没有实现类,也可以直接调用(默认方法需要接口实例,静态方法直接用接口名调用),但你的代码里显然是抽象方法,所以还是依赖传入的实现类实例。
内容的提问来源于stack exchange,提问作者A M A

