У Джастина общий случай;Я хотел бы упомянуть два особых случая, продемонстрированных этим фрагментом кода:
import java.util.Comparator;
public class WhoCalledMe {
public static void main(String[] args) {
((Comparator)(new SomeReifiedGeneric())).compare(null, null);
new WhoCalledMe().new SomeInnerClass().someInnerMethod();
}
public static StackTraceElement getCaller() {
//since it's a library function we use 3 instead of 2 to ignore ourself
return Thread.currentThread().getStackTrace()[3];
}
private void somePrivateMethod() {
System.out.println("somePrivateMethod() called by: " + WhoCalledMe.getCaller());
}
private class SomeInnerClass {
public void someInnerMethod() {
somePrivateMethod();
}
}
}
class SomeReifiedGeneric implements Comparator<SomeReifiedGeneric> {
public int compare(SomeReifiedGeneric o1, SomeReifiedGeneric o2) {
System.out.println("SomeRefiedGeneric.compare() called by: " + WhoCalledMe.getCaller());
return 0;
}
}
Это печатает:
SomeRefiedGeneric.compare() called by: SomeReifiedGeneric.compare(WhoCalledMe.java:1)
somePrivateMethod() called by: WhoCalledMe.access$0(WhoCalledMe.java:14)
Даже если первый из них называется "напрямую" из main()
, а второй изSomeInnerClass.someInnerMethod()
.Это два случая, когда между двумя методами выполняется прозрачный вызов.
- В первом случае это происходит потому, что мы вызываем метод моста для универсального метода., добавленный компилятором, чтобы обеспечить возможность использования SomeReifiedGeneric в качестве необработанного типа.
- Во втором случае это потому, что мы вызываем закрытый член WhoCalledMe из внутреннего класса.Для этого компилятор добавляет синтетический метод в качестве посредника для переопределения проблем видимости.