Conflictos de nomenclatura de interfaz en Java

Las interfaces en Java consisten en métodos abstractos (que no contienen un cuerpo) y variables (que son finales estáticas públicas). La implementación de los métodos de la interfaz se define en las clases que implementan esa interfaz. Ayuda a Java a lograr la abstracción. 

Los conflictos de nombres ocurren cuando una clase implementa dos interfaces que tienen métodos y variables con el mismo nombre.

Conflictos de nomenclatura de interfaz

Como la interfaz consta de variables y métodos, pueden ocurrir dos tipos de conflictos de nombres.

  1. Conflicto de nombres de métodos
  2. Conflicto de nombres de variables

1. Conflicto de nombres de métodos

Los conflictos de nomenclatura de este método pueden ocurrir en varios casos. 

Caso-1: cuando tenemos dos interfaces con el mismo nombre de método, la misma firma, el mismo tipo de retorno, la clase de implementación puede implementar cualquiera de ellos, y no podemos decir cuál de estos implementó.

Código

Java

public interface Interface1 {
 
    // create a method
    public void show();
}

Java

public interface Interface2 {
 
    // create a method
    public void show();
}

Java

public class Case1 implements Interface1, Interface2 {
    // implement the methods of interface
    public void show()
    {
        System.out.println("Geeks For Geeks");
    }
    public static void main(String[] args)
    {
        // create object
        Case1 obj = new Case1();
        // using object call the implemented method
        obj.show();
    }
}

Producción 

Geeks For Geeks

Explicación: Aquí, en el siguiente código, no podemos confirmar qué muestra se ejecuta un método de 2 interfaces. No se lanzará ningún error.

Caso 2: cuando dos interfaces consisten en métodos con el mismo nombre pero firmas diferentes, entonces en la clase de implementación, necesitamos implementar tanto los métodos como los métodos que se ejecutan según el tipo de método que llamamos. 

Código 

Java

public interface Interface1 {
 
    // create a method
    public void show();
}

Java

package geeks;
 
public interface Interface2 {
    // define an abstract method with parameters
    public void show(String s);
}

Java

public class Case2 implements Interface1, Interface2 {
    // implement method of Interface2
    @Override public void show(String s)
    {
        System.out.println(s);
    }
    // implement method of Interface1
    @Override public void show()
    {
        System.out.println("Geeks For Geeks");
    }
 
    public static void main(String[] args)
    {
 
        // create object
        Case2 obj = new Case2();
        // calling methods
        obj.show();
        obj.show("GFG");
    }
}

Producción 

Geeks For Geeks
GFG

Explicación: En este caso, la ejecución de estos métodos se puede diferenciar en función de la firma y el tipo de retorno se ignora en este caso.

Caso 3: cuando dos interfaces contienen un método con el mismo nombre, la misma firma pero diferentes tipos de devolución, en este caso, ambas interfaces no se pueden implementar en la misma clase. Es necesario crear clases separadas para implementar cada interfaz de ese tipo.

Código 

Java

public interface Interface1 {
 
    // create a method
    public void show();
}

Java

public interface Interface2 {
    // create method with same name & signature but
    // different return type
    public String show();
}

Java

// implement only 1 interface
public class Case3_1 implements Interface1 {
    // override method of that interface
    @Override public void show()
    {
        System.out.println("Geeks for Geeks");
    }
 
    public static void main(String[] args)
    {
        // create object
        Case3_1 obj = new Case3_1();
        // calling method
        obj.show();
    }
}

Producción 

Geeks for Geeks

Explicación: En este caso, no podemos implementar ambas interfaces en la misma clase porque se puede generar un error debido a la ambigüedad entre ellas. Entonces necesitamos crear una clase diferente para implementar Interface2.

Otros ejemplos: 

Java

// implement only 1 interface
public class Case3_2 implements Interface2 {
    // override the method of interface
    @Override public String show() { return "GFG"; }
 
    public static void main(String[] args)
    {
        // object creation
        Case3_2 obj = new Case3_2();
        // calling method
        String res = obj.show();
        // printing returned result
        System.out.println(res);
    }
}

Producción 

GFG

Si intentamos implementar ambas interfaces en la misma clase, arrojará un error.

Código (Error de lanzamientos)

Java

public class Case3_1_2 implements Interface1, Interface2 {
 
    public void show()
    {
        System.out.println("Geeks for Geeks");
    }
    @Override public String show()
    {
        String s = "GFG" return s;
    }
 
    public static void main(String[] args)
    {
        Case3_1_2 obj = new Case3_1_2();
        obj.show();
    }
}

Producción 

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    The return type is incompatible with Interface2.show()
    Duplicate method show() in type Case3_1_2
  • Como implementamos métodos que tienen la misma firma y nombres con un tipo de retorno diferente de ambas interfaces en la misma clase, arroja un error.
  • Es imposible implementarlos en la misma clase.

Ahora pasaremos a otro tipo de conflictos de nombres de interfaz.

2. Conflicto de nombres de variables

Cuando dos interfaces consisten en la variable con el mismo nombre, entonces la clase que implementa esas interfaces no puede identificar a qué variable acceder y arroja un error. Por lo tanto, para resolver eso, acceda a la variable usando el nombre de la interfaz como referencia.

Código

Java

public interface Interface1 {
    String s = "Geeks for Geeks";
}

Java

public interface Interface2 {
    String s = "GFG";
}

Java

// implement the interfaces
public class VariableConflict
    implements Interface1, Interface2 {
    public static void main(String[] args)
    {
        // create object
        VariableConflict obj = new VariableConflict();
       
        // if we print the data in variable with out
        // specifying reference of interface it throws error
        // System.out.println(s);  error
        System.out.println(Interface1.s);
        System.out.println(Interface2.s);
    }
}

Producción

Geeks for Geeks
GFG

Explicación: aquí, si no usamos la referencia del nombre de la interfaz al acceder a las strings, arroja un error de referencia ambiguo. Por lo tanto, usar el nombre de la interfaz como referencia evita la ambigüedad al acceder. 

Publicación traducida automáticamente

Artículo escrito por akhilvasabhaktula03 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *