I noticed a difference in the output of the following program when run with Java 8 and Java 9.
import java.lang.reflect.Method;
public class OrderingTest {
public static void main(String[] args) {
ServiceImpl service = new ServiceImpl();
for (Method method : service.getClass().getMethods()) {
for (Class<?> anInterface : method.getDeclaringClass().getInterfaces()) {
try {
Method intfMethod = anInterface.getMethod(method.getName(), method.getParameterTypes());
System.out.println("intfMethod = " + intfMethod);
} catch (NoSuchMethodException e) { }
}
}
}
}
class ServiceImpl implements ServiceX {
@Override
public Foo getType() { return null; }
}
interface ServiceX extends ServiceA<Foo>, ServiceB { }
abstract class Goo { }
class Foo extends Goo { }
interface ServiceA<S> {
S getType();
}
interface ServiceB {
@java.lang.Deprecated
Goo getType();
}
You can run both versions of java here:
https://www.jdoodle.com/online-java-compiler/
Java 8 outputs:
intfMethod = public abstract java.lang.Object ServiceA.getType()
intfMethod = public abstract java.lang.Object ServiceA.getType()
intfMethod = public abstract java.lang.Object ServiceA.getType()
Java 9 outputs:
intfMethod = public abstract Goo ServiceB.getType()
intfMethod = public abstract Goo ServiceB.getType()
intfMethod = public abstract Goo ServiceB.getType()
But when I reorder the super-interfaces to:
interface ServiceX extends ServiceB, ServiceA<Foo> { }
Then both versions of java output:
intfMethod = public abstract Goo ServiceB.getType()
intfMethod = public abstract Goo ServiceB.getType()
intfMethod = public abstract Goo ServiceB.getType()
I was wondering what is causing it? Is there a new java feature I am not aware of?
Java 8 documentation
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8
Java 9 documentation
https://docs.oracle.com/javase/specs/jls/se9/html/jls-8.html#jls-8.4.8
question from:
https://stackoverflow.com/questions/65937177/java-superinterfaces-runtime-difference-java-8-vs-java-9 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…