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

为什么不能使用接口实现的实例作为参数和返回类型?

帅煌
2023-03-14

我想问一下你为什么在这种情况下使用@Overdge会产生错误“方法不会从它的超类中覆盖方法”?为什么我不能使用类的实例实现一个接口作为参数,并返回由同一接口定义的方法的类型?

 public interface Request {
    //....
  }

  public interface Response {
    //....
  }

  public class MyRequest implements Request {
    //....
  }

  public class MyResponse implements Response {
    //....
  }

  public interface Order {
    Response cancel(Request request);
  }

  public class MyOrder implements Order {

    @Override
    public MyResponse cancel(MyRequest request) {
      return null;
    }

  }

共有2个答案

齐驰
2023-03-14

问题是要取消的参数。

public MyResponse cancel(MyRequest request) {
      return null;
}

您不能将< code >超类型传递给< code >子类型(在本例中,将< code>Request对象传递给< code>MyRequest参数),因为< code >子类型的实现可能有< code >超类型不知道的其他方法。

万俟小林
2023-03-14

下面的方法不可行——但是继承要求必须这样做。

class MyOtherRequest implements Request { ... }

MyOrder myOrder = new MyOrder();
Order order = myOrder; // okay because myOrder is a subtype of Order
order.cancel(new MyOtherRequest()); // unimplemented!

因此,子类型的方法必须接受父类型的方法可以接受的所有可能的值——而不仅仅是子集。

 类似资料:
  • 问题内容: 如何在实现类中强制执行方法getFoo(),返回相同实现类类型的列表。 现在,实现Bar的类将返回实现Bar的任何类的对象。我想使其更加严格,以便实现Bar的类在getFoo()中仅返回其类型的对象列表。 问题答案: 不幸的是,这不能由Java的类型系统强制执行。 但是,您可以通过使用以下方法来达到非常接近的效果: 然后您的实现类可以像这样实现它: 但是没有什么可以阻止另一个类这样做:

  • 但是,我的问题在于如何理解当我尝试使用而不是执行相同操作时会发生什么 这里的例子是,有一个接口定义被定义为接受一个接口参数,实际上,这个接口参数是由实现接口的枚举实现的: 我有两个接口: 我看到了一些关于,但这扩展了我的理解。请救命! 顺便说一句,我认为返回类之前的泛型声明被用来指定“T”以用于类型侵蚀的目的,这是正确的吗?

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

  • 为什么我不能在Java中做到这一点: 不会是子类。add已经实现Context。add,因为它add(Object)可以执行add(Integer)可以执行的所有操作? 解决这个问题的好方法是什么? 现在我正在做一种丑陋的方式: 编辑:这不是上述问题的副本。在给定的问题中,超类是以更一般的“Object”作为参数的类,而子类则更具体。这不起作用,因为更具体的方法可能无法处理任何对象。在我的问题中,

  • 我有两个接口。第一个: 第二个使用第一个接口作为其方法定义中的参数类型: 我有一个实现 IGoable 接口的类: 问题来了。我在一个类中实现了IMove接口,并尝试在实现的move()方法中使用ImplGoable类作为参数,如下所示: 它给我以下错误: TestGo类型的方法移动(ImpGoable)必须重写或实现超类型方法 为了避免错误,我必须使用 IGoable 接口作为实现方法中参数的类

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