Java中的接口命名冲突
Java中的接口由抽象方法(不包含主体)和变量(公共静态最终)组成。接口方法的实现在实现该接口的类中定义。它帮助Java实现抽象。
当一个类实现了两个具有相同名称的方法和变量的接口时,就会发生命名冲突。
接口命名冲突
由于接口由变量和方法组成,因此可能会发生两种类型的命名冲突。
- 方法命名冲突
- 变量命名冲突
1.方法命名冲突
这种方法命名冲突可能在各种情况下发生。
Case-1:当我们有两个方法名、签名相同、返回类型相同的接口时,实现类可以实现其中任何一个,但不能说实现了哪一个。
代码
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();
}
}
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");
}
}
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();
}
}
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);
}
}
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();
}
}
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);
}
}
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();
}
}
输出
Geeks For Geeks
说明:在下面的代码中,我们无法确定执行了哪个显示 2 个接口的方法。不会抛出任何错误。
Case-2:当两个接口由同名但签名不同的方法组成时,那么在实现类中,我们需要实现方法和方法,并根据我们调用的方法类型来执行。
代码
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");
}
}
输出
Geeks For Geeks
GFG
说明:在这种情况下,可以根据签名来区分这些方法的执行,在这种情况下忽略返回类型。
Case-3:当两个接口包含同名、相同签名但返回类型不同的方法时,这种情况下,两个接口不能在同一个类中实现。需要创建单独的类来实现该类型的每个接口。
代码
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();
}
}
输出
Geeks for Geeks
说明:在这种情况下,我们不能在同一个类中实现这两个接口,因为它们之间的歧义可能会引发错误。所以我们需要创建一个不同的类来实现Interface2。
其他示例:
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);
}
}
输出
GFG
如果我们尝试 然后在同一个类中实现这两个接口,它会抛出一个错误。
代码(抛出错误)
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();
}
}
输出
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
- 当我们实现具有相同签名和名称的方法时,同一类中的两个接口的返回类型不同会引发错误。
- 在同一个类中实现这些是不可能的。
现在我们将进入另一种类型的接口命名冲突
2.变量命名冲突
当两个接口由同名的变量组成时,实现这些接口的类无法识别访问哪个变量并抛出错误。因此,要解决这个问题,请使用接口名称作为引用访问变量。
代码
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);
}
}
输出
Geeks for Geeks
GFG
说明:这里,如果我们在访问字符串s 时不使用接口名称的引用,则会引发歧义引用错误。因此,使用接口名称作为参考可以防止访问时出现歧义。