Interfaces in Java consist of abstract methods (which do not contain a body) and variables (which are public static final). Implementation of the methods of the interface is defined in classes that implement that interface. It helps Java to achieve abstraction.
Naming Conflicts occur when a class implements two interfaces that have methods and variables with the same name.
Interface Naming Conflicts
As Interface consists of variables and methods, So two types of naming conflicts can happen.
- Method Naming Conflict
- Variable Naming Conflict
1. Method Naming Conflict
This method naming conflicts can happen in various cases.
Case-1: When we have two interfaces with the same method name, same signature, same return type, the implementation class can implement any one of them, and we can’t say which one of these implemented.
Code
public interface Interface1 {
// create a method
public void show();
} |
public interface Interface2 {
// create a method
public void show();
} |
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();
}
} |
Output
Geeks For Geeks
Explanation: Here in the below code, we can’t confirm which show a method of 2 interfaces gets executed. No error will be thrown.
Case-2: When two interfaces consist of methods with the same name but different signatures, then in the implementation class, we need to implement both the methods and methods get executed based on the kind of method we called.
Code
public interface Interface1 {
// create a method
public void show();
} |
package geeks;
public interface Interface2 {
// define an abstract method with parameters
public void show(String s);
} |
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" );
}
} |
Output
Geeks For Geeks GFG
Explanation: In this case, the execution of these methods can be differentiated based on the signature, and return type is ignored in this case.
Case-3: When two interfaces contain a method with the same name, same signature but different return types, in this case, both interfaces can’t be implemented in the same class. Separate classes need to be created to implement each interface of that type.
Code
public interface Interface1 {
// create a method
public void show();
} |
public interface Interface2 {
// create method with same name & signature but
// different return type
public String show();
} |
// 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();
}
} |
Output
Geeks for Geeks
Explanation: In this case, we can’t implement both interfaces in the same class because an error can be thrown due to ambiguity between them. So we need to create a different class to implement Interface2.
Other Examples:
// 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);
}
} |
Output
GFG
If we try to implement both interfaces in the same class then, it will throw an error.
Code (Throws error)
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();
}
} |
Output
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
- As we implemented methods having the same signature and names with a different return type of both the interfaces in the same class throws an error.
- It is impossible to implement these in the same class.
Now we will move into another type of interface naming conflicts
2. Variable Naming Conflict
When two interface consists of the variable with the same name, then the class which implements those interfaces can’t identify which variable to access and throws an error. Hence, to resolve that, access the variable using the interface name as the reference.
Code
public interface Interface1 {
String s = "Geeks for Geeks" ;
} |
public interface Interface2 {
String s = "GFG" ;
} |
// 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);
}
} |
Output
Geeks for Geeks GFG
Explanation: Here, if we don’t use of reference of interface name while accessing strings s it throws an ambiguous reference error. So using the Interface name as a reference prevents ambiguity while accessing.