📜  Java中的接口命名冲突

📅  最后修改于: 2022-05-13 01:55:47.696000             🧑  作者: Mango

Java中的接口命名冲突

Java中的接口由抽象方法(不包含主体)和变量(公共静态最终)组成。接口方法的实现在实现该接口的类中定义。它帮助Java实现抽象。

当一个类实现了两个具有相同名称的方法和变量的接口时,就会发生命名冲突。

接口命名冲突

由于接口由变量和方法组成,因此可能会发生两种类型的命名冲突。

  1. 方法命名冲突
  2. 变量命名冲突

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 时不使用接口名称的引用,则会引发歧义引用错误。因此,使用接口名称作为参考可以防止访问时出现歧义。