当前位置: 首页 > 知识库问答 >
问题:

如果第一个接口定义了实现类,为什么我不能在另一个接口中使用它作为参数?

万选
2023-03-14

我有两个接口。第一个:

public interface IGoable {
     int go();
}

第二个使用第一个接口作为其方法定义中的参数类型:

public interface IMove {
    int move(IGoable goThisMany);
}

我有一个实现 IGoable 接口的类:

public class ImplGoable implements IGoable {
    @Override
    public int go() {
        return 0;
    }

    public int dumby() {
        return 1;
    }
}

问题来了。我在一个类中实现了IMove接口,并尝试在实现的move()方法中使用ImplGoable类作为参数,如下所示:

public class TestGoThere implements IMove {

    @Override
    public int move(ImplGoable goImp) {
        return goImp.go();
    }

}

它给我以下错误:

TestGo类型的方法移动(ImpGoable)必须重写或实现超类型方法

为了避免错误,我必须使用 IGoable 接口作为实现方法中参数的类型,如下所示:

public class TestGoThere implements IMove {

    @Override
    public int move(IGoable goImp) {
        return goImp.go();
    }

}

为什么我不能使用ImplGoable类,因为它实现了IGoable接口?

共有2个答案

姬歌者
2023-03-14

您可以使用泛型来解决此问题(尽管您是否愿意完全取决于您的用例)。

如果将接口的定义更改为:

public interface IMove<T extends IGoable> {
    int move(T goThisMany);
}

这允许您在实现接口的类中定义具体的实现,即:

public class TestGoThere implements IMove<ImplGoable> {

    @Override
    public int move(ImplGoable goImp) {
        return goImp.go();
    }

} 

并允许您使用ImplGoable作为参数参数类型。正如我所说,你是否想这样做是一个完全不同的问题,真正取决于你想做什么。这里有一些关于泛型的好文章。

阎枫涟
2023-03-14

您不能使用< code>ImplGoable来代替< code>IGoable,因为在您的声明中,您只设置了与< code>IGoable接口的约定。< code>ImplGoable将实现并覆盖接口方法,但无法阻止它添加新方法。由于您的契约,您可以使用的唯一方法是在您的接口中定义的方法,即< code>go()。因此,您可以使用< code>goImp对象,但仅限于其契约范围内,这意味着对象可以是实现接口的任何有效对象,但类型只需< code>IGoable

 类似资料:
  • 问题内容: 我的意思是: 我用谷歌搜索,发现了这个: 表示定义接口方法的实现。但是接口没有实现,因此是不可能的。 但是,interface是100%抽象的类,抽象类可以实现接口(100%抽象的类)而无需实现其方法。将其定义为“接口”时会出现什么问题? 详细来说, 问题答案: 表示实现,当旨在声明仅提供不提供实现时。 A 100%,是功能上等同于,但它也可以实现,如果你想(在这种情况下,它不会保持1

  • 问题内容: @Entity public class Husband implements Serializable { 广义上是什么? 类为什么实现接口? 为什么丈夫成员一个人只有@OnetoOne(mappedBy =“ Wife”),而妻子成员却没有@OnetoOne(mappedBy =“ husband”) 问题答案: 广义上讲,序列化是Java为开发人员提供的将任何对象的状态持久保存到

  • 问题内容: 在Java中,当接口扩展另一个接口时: 为什么要实现其方法? 当接口不能包含方法主体时,如何实现其方法 当扩展另一个接口而不实现它时,如何实现这些方法? 接口实现另一个接口的目的是什么? 这是Java的主要概念! 编辑: 在eclipse中,除了中的实现方法之外,还有实现符号。 当我将鼠标悬停在它上面时,它表示它实现了该方法!!! 问题答案: 为什么要实现其方法?当接口不能包含方法主体

  • 问题内容: 我想知道我们可以在一个接口内定义一个接口。喜欢 这是面试中提出的问题。任何实时使用。 问题答案: 是的,我们可以做到。Java中的嵌套接口的定义如下: 嵌套接口是其声明出现在另一个类或接口的主体内的任何接口。顶级接口是不是嵌套接口的接口。 请参阅此为多。 进一步 … 一个原因可能是外部接口具有一种将回调实现作为参数的方法。在这种情况下,嵌套接口是回调方法必须实现的协定。我没有理由在顶层

  • 我只想问关于争论的事。方法名并不重要,但每个方法都采用不同参数的唯一顺序,因此Oracle可以实现这个特性,而不是让每个“lambda-interface”都有一个方法。

  • 问题内容: 我一直在研究J2EE的JMS API,发现了一个奇怪的行为,其中在接口(例如Session中的createQueue)中声明的某些方法在诸如QueueSession之类的子接口中再次声明,并且具有相同的文档。 因为子接口“继承”了它继承的接口的所有方法声明,并且由于JavaDoc工具没有问题,所以可以对子接口的JavaDoc进行排序并创建“继承的操作”列表,因此我无法弄清楚这将实现什么