我正在使用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);
}
}
缺少什么或不正确?
答案 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
类中Article
和Article
方法未被覆盖。他们正在重载。
更改参数类型时,它是重载而不是覆盖。这可能看起来有点令人困惑,但要理解的关键是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);
}
}