Это работает, когда метод может быть разрешен во время компиляции, потому что возвращаемый тип является частью подписи. После стирания у вас есть два метода
public EJBHome lookupHome(Class homeClass) throws PayrollException;
public EJBLocalHome lookupHome(Class homeClass) throws PayrollException;
Вы не можете определить их без обобщений, но так как тип возвращаемого значения является частью сигнатуры, это разные методы.
Вы можете позвонить
lookupHome(EJBHome.class);
lookupHome(EJBLocalHome.class);
но не
Class c= EJBHome.class;
lookupHome(c); // Ambiguous method call.
РЕДАКТИРОВАТЬ: Попробуйте следующее.
for (Method method : EJBHomeFactory.class.getDeclaredMethods()) {
System.out.println(method);
}
И вы должны увидеть что-то вроде
public javax.ejb.EJBHome EJBHomeFactory.lookupHome(java.lang.Class)
public javax.ejb.EJBLocalHome EJBHomeFactorylookupHome(java.lang.Class)
Аналогично, если вы используете javap -c.
invokevirtual # 8; // Метод lookupHome: (Ljava / lang / Class;) Ljavax / ejb / EJBHome;
invokevirtual # 10; // Метод lookupHome: (Ljava / lang / Class;) Ljavax / ejb / EJBLocalHome;
РЕДАКТИРОВАТЬ Если вы хотите пример, где тип возвращаемого значения является частью подписи ..
class A {
public static Byte getNum() { return 0; }
}
class B {
public static void main(String ... args) {
int i = A.getNum();
System.out.println(i);
}
}
Скомпилируйте и запустите это, и вы не получите ошибку, теперь измените сигнатуру getNum в A на
class A {
public static Integer getNum() { return 0; }
}
и скомпилируйте только класс A. Если тип возвращаемого значения не был частью сигнатуры, это не будет иметь никакого значения для B, однако если вы запустите B без перекомпиляции, вы получите
Exception in thread "main" java.lang.NoSuchMethodError: A.getNum()Ljava/lang/Byte;
at B.main(B.java:10)
Как видите, тип возвращаемого значения Ljava/lang/Byte;
является внутренним именем возвращаемого типа и частью подписи.