如何解决两个接口中方法的名称冲突

时间:2014-10-21 02:16:42

标签: java

我有两个接口,但它们具有相同的方法,具有不同的返回值,例如floatdouble。如何在类中实现它们,但不能更改方法名称?

//Calculate.java
public interface Calculate {
    final float PI = 3.141592f;
    float getCircumference(float r);
    float getArea(float r);
}
interface GeometryShape{
    public static final float PI = 3.14159f;
    public abstract float getCircumference(float r);
    public abstract double getArea(float r);
    public abstract void draw();
}

//Circ.java
public class Circ implements  Calculate, GeometryShape{
    public float getCircumference(float r){
        return Calculate.PI * 2 * r;
    }

    public float getArea(float r){
        return Calculate.PI * r * r;
    }

3 个答案:

答案 0 :(得分:2)

除非方法在返回不同类型时参数类型(或方法名称)不同,否则无法实现两个接口

来自JLS-8.1.5

  

一个类不能有多个具有相同签名和不同原始返回类型的方法(§8.4)。

答案 1 :(得分:0)

Elliot Frisch描述的是真实的;只允许一种方法具有该特定方法签名。方法签名由其方法名称及其形式参数描述 - 返回类型,可见性,无论是否static - 都无关紧要。

但是,我会更容易说这两个界面实际上是相同的,只有一个真正需要存在。

在实施API时,您可以将其视为实施者必须遵循的真实合同,以及 实施方式的细节并不重要。为此,我实际上假设GeometryShape可以被视为所有几何形状的基础,而这恰好适合作为抽象类。

从那里,界面将失去常量声明,并可能变成形容词(Calculable,因为所有GeometricShapes都是Calculable)。那么你只有一个地方可以处理签名不匹配。

这是一个样本。

interface Calculable {
    float getCircumference(float r);
    float getArea(float r);
}

abstract class GeometryShape implements Calculable {
    public static final float PI = 3.14159f;
    public abstract float getCircumference(float r);
    public abstract float getArea(float r);
    public abstract void draw();
}

我把剩下的作为练习留给读者。

答案 2 :(得分:0)

添加我的两分钱:你可以实现两个接口定义具有相同签名的方法,只有当两者的行为相同时:因为只有一个方法对两个接口都实现了,两者的处理方式相同。

interface IName {
    int getID();
    String getName();
}
interface IValue {
    int getID();
    String getValue();
}

class Data implements IName, IValue {
    int id;
    String name, value;

    @Override
    public int getID() { // Obviously the same behaviour is expected for IName and IValue
        return id;
    }

    @Override
    public String getName() {
        return name;
   }

    @Override
    public String getValue() {
        return value;
   }
}

但是你无法区分这两个接口的实现(尽管在未来的Java版本(public int IName.getID()?)会很好,因为有时你必须实现的接口不受你的控制)。