【问题标题】:Error implementing Interface Methods in Class在类中实现接口方法时出错
【发布时间】:2017-02-03 01:04:06
【问题描述】:

我正在使用接口处理一个简单的项目,但在使我的类符合接口时遇到问题。

我的想法是,既然 Article 实现了 IDedObject,我应该能够在我的 Article Class 定义中的重写函数中将 Article 作为参数传递。不幸的是,这会引发错误“类型 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);
}
}

有什么遗漏或不正确?

【问题讨论】:

  • 您的界面本身没有意义。为什么它的方法带参数?为什么是自己的类型??
  • 请发布您的完整要求,因为我认为您在这里缺少首要原则。
  • 您的 getID 和 printID 应该以 IDedObject 作为参数。
  • @HovercraftFullOfEels 我从 Java 文档中对界面进行了建模。您可以看到 Relatable 接口包含一个使用 Relatable 对象作为参数的方法。 link
  • 覆盖时不能改变类型;根据定义,覆盖需要具有超类型方法的相同签名。

标签: java interface


【解决方案1】:

只是猜测,因为我们没有您的要求,但我认为您的接口已损坏,您的方法不应该需要参数,更不用说它自己类型的参数了。考虑改变:

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

到:

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);
    }
}

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

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

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

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

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();
    }

}

【讨论】:

  • 我最初是这样设计的,但是在我的 Article 类中出现了一个错误 "The type Article must implement the继承的抽象方法 IDedObject.getID()" ,这对我来说意味着我可以'不要将参数传递给函数,对吧?
  • 这如何回答这个问题?
  • @zcoon:如果您需要将当前对象与另一个 IDedObject 进行比较,例如,如果您想将类设为 Comparable,则应该只使用采用 IDedObject 的方法。
  • @CKing:问题是XY Problem,我正在尝试解决潜在的问题本身,而不是解决直接问题,因为直接问题是错误的树。
  • 感谢@HovercraftFullOfEels .. 令人尴尬的是,我忽略了这样一个事实,即我可以访问 Article 的属性,而无需将 Article 的实例传递给其内部定义的方法。
【解决方案2】:

getIDputID 方法没有在Article 类中被覆盖。它们被超载

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

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

【讨论】:

  • 那么getter方法带参数?这没有意义。
  • 我只是在回答被问到的直接问题 我的思考过程是,由于 Article 实现了 IDedObject,我应该能够在我的 Article 中的覆盖函数中将 Article 作为参数传递类定义。不幸的是,这会引发错误“文章类型必须实现继承的抽象方法 IDedObject.getID()
  • 可能最好的解决方案是同时回答直接问题和 XY 问题问题。
  • 回答直接问题是强制性的。没有这个的任何答案都是不正确的。
  • 其他方式。是的,我们应该同时回答(我已经更新了我的回答),但首先我们应该帮助解决 xy 问题。请参阅various meta questions on this
【解决方案3】:

你的覆盖

public int getID(Article article)

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

【讨论】:

    【解决方案4】:

    你需要强制转换到接口的实现(文章)。接口和类中的方法签名需要一致。

    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);
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多