为什么这个Java函数签名被标记为覆盖错误?

ddrv8njm  于 2022-12-25  发布在  Java
关注(0)|答案(2)|浏览(129)

以下情况
此接口

public Interface ObjectService<T> {

  public T fromMNO(MNO<T> mno);

}

被这个抽象类使用

public AbstractObjectService<T> implements ObjectService<T> {

  public abstract T fromMNO (MNO<T> mno);

}

在此类中实现

public DummyService extends AbstractObjectService<DummyObj> {

  @Override
  public DummyObj fromMNO (DummyMNO mno) {
    //do stuff
    return new DummyObj();
  }

}

使用该接口和接口对象

public interface MNO<T> {}

public class DummyMNO implements MNO<DummyObj> {}

和一个普通物体

public class DummyObj {}

现在的问题是:DummyService#fromMNO在类型不匹配的VS代码bc中被标记为不可重写。
但据我所知,DummyServiceT作为DummyObj的结果是public DummyObj fromMNO (MNO<DummyObj> mno)DummyMNO是一个MNO<DummyObj>
是我错了还是有什么可疑的?
一个“解决方案”是保持“原始类型”并像这样强制转换

@Override
  public DummyObj fromMNO<T> (MNO<DummyObj> mno) {
    DummyMNO d = (DummyMNO) mno;
    //do stuff
    return new DummyObj();
  }

这解决了错误的问题,但是破坏了我想要实现的显式类型。

cuxqih21

cuxqih211#

正如@ Seelenhuose所指出的,是的,不可能改变函数的签名。
但是,可以使用以下命令更改所需的类型

public Interface ObjectService<T, M extends MNO<T>> {

  public T fromMNO(M mno);

}

public AbstractObjectService<T, M extends MNO<T>> implements ObjectService<T, M> {

  public abstract T fromMNO (M mno);

}

public DummyService extends AbstractObjectService<DummyObj, DummyMNO> {

  @Override
  public DummyObj fromMNO (DummyMNO mno) {
    //do stuff
    return new DummyObj();
  }

}
zqry0prt

zqry0prt2#

您在DummyService类中覆盖的fromMNO方法与AbstractObjectService中的fnoMNO类型不匹配。
解决方案之一是您已经在DummyService类的方法中输入了更改参数的问题,您可以这样做...

public DummyService extends AbstractObjectService<DummyObj> {
  @Override
  public DummyObj fromMNO (MNO<DummyObj> mno) {
    return new DummyObj();
  }
}

否则,您可以在AbstractObjectService中更改原始类型

public abstract class AbstractObjectService<T> implements ObjectService<T> {

  public abstract T fromMNO (DummyMNO mno);

}

相关问题