在类中实现接口方法时出错

时间:2016-09-25 18:05:13

标签: java interface

我正在使用Interfaces开发一个简单的项目,但是我遇到了一个使我的类符合接口的问题。

我的思维过程是因为Article实现了IDedObject,所以我应该能够在我的Article Class定义中将一个Article作为参数传递给我的重写函数。不幸的是,这会引发错误“类型文章必须实现继承的抽象方法IDedObject.getID()”

接口

public interface IDedObject{
    public int getID(IDedObject object);
    public void printID(IDedObject object);
}

public class Article implements IDedObject{
private int articleID;
private String articleName;
private String authorName;

@Override
public int getID(Article article){
    return article.articleID;
}

@Override
public void printID(Article article){
    System.out.println(article.articleID);
}
}

缺少什么或不正确?

4 个答案:

答案 0 :(得分:2)

因为我们没有您的要求,所以只能猜测,但我认为您的界面已损坏,您的方法不应该需要参数更少的自己类型的参数。考虑改变:

public interface IDedObject{
    public int getID();
    public void printID();
}    

为:

public class Article implements IDedObject{
    private int articleID;
    private String articleName;
    private String authorName;

    // constructor and other getter and setter methods here

    @Override
    public int getID(){
        return articleID;
    }

    @Override
    public void printID(){
        System.out.println("" + articleID);
    }
}

然后实施将是微不足道的

public interface FooInterface {
    int getValue();
    void printValue();
    int difference(FooInterface fi);
}

至于编译器错误 - 任何重写方法的签名必须与接口方法的签名相匹配。因此,例如在链接的Rectangle示例中,如果扩展该类或接口,则method参数必须采用接口中声明的interface参数。

例如,假设您有以下界面:

class FooClass implements FooInterface {

    private int value;

    @Override
    public int getValue() {
        return this.value;
    }

    @Override
    public void printValue() {
        System.out.println(String.valueOf(value));
    }

    @Override  // can't use FooClass for parameter here
    public int difference(FooInterface fi) {
        return value - fi.getValue();
    }

}

实现此接口的具体类必须为差异方法使用FooInterface参数。例如:

{{1}}

答案 1 :(得分:2)

putID类中ArticleArticle方法未被覆盖。他们正在重载

更改参数类型时,它是重载而不是覆盖。这可能看起来有点令人困惑,但要理解的关键是TEXT从接口继承了两个方法。当您更改参数类型时,实际上重载这些继承的方法而不是覆盖它们。

也就是说,getter方法的目的是返回实例变量的值,并可选择在返回之前对该值执行某些操作。

答案 2 :(得分:0)

您的覆盖

public int getID(Article article)

由于参数不匹配,它不会覆盖接口的方法 - 它应该是IDedObject。 您可以使用通用参数IDedObject,并使用通配符约束来确保它实现IDedObject,但据我所知,没有办法告诉Java您要继承与通配符类型相同。

答案 3 :(得分:-1)

您需要强制转换为接口的实现(文章)。接口和类中的方法签名必须相同。

public interface IDedObject{
    public int getID(IDedObject object);
    public void printID(IDedObject object);
}

public class Article implements IDedObject{
    private int articleID;
    private String articleName;
    private String authorName;

    @Override
    public int getID(IDedObject object) {
        Article article = (Article) object;
        return article.articleID;
    }

    @Override
    public void printID(IDedObject object) {
        Article article = (Article) object;
        System.out.println(article.articleID);

    }
}