java - tutorial - Dos métodos al implementar la interfaz que contiene solo uno
swing java ejemplos (2)
Si nos fijamos en el bytecode TwoMethods de la interfaz, veremos que el método real es
public abstract method(Ljava/lang/Object;)V
es decir, no existe información sobre el nivel de bytecode sobre el tipo de parámetro, el tipo se borra, JVM simplemente no conoce los genéricos, los parámetros de tipo se reemplazan con Object
o en caso de que T extends X
con X
Así que desde el punto de vista de JVM.
class A implements TwoMethods<A> {
public void method(A a) {
...
method(A a)
no anula el método de interfaz porque en el bytecode está en el method(Object obj)
puede anularlo. Para solucionar este problema, el compilador construye un método implícito, denominado método de puente, en la clase A
public void method(Object obj) {
method((A)obj);
}
visible solo en bytecode. Ahora para este código
A a = new A();
TwoMethods<A> tm = a;
tm.method(a);
el compilador reemplazará tm.method(a)
con una llamada al puente
INVOKEINTERFACE test/TwoMethods.method(Ljava/lang/Object;)V
y esto redireccionará la llamada a A.method(A a);
He creado la interfaz TwoMethods
. Código fuente:
interface TwoMethods<T>
{
public void method(T t);
}
Luego creé la clase implementando esta interfaz y después de desensamblar vi 2 métodos. Clase:
class A implements TwoMethods<A>
{
@Override
public void method(A a) {}
}
Después de desmontar:
class A implements TwoMethods<A> {
A();
public void method(A); //first
public void method(java.lang.Object); //second
}
Del mismo modo para la interfaz Comparable
. Por qué cuando creo una interfaz parametrizada tengo 2 métodos. ¿Siempre es, cuando uso el parámetro? También tengo método con Object
como argumento?
method(java.lang.Object)
se denomina método de puente y se genera debido al borrado de tipo en el momento de la compilación.