为什么这个Java函数签名被标记为错误的重写?



以下情况

该接口

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 Code bc中被标记为不可重写。

但就我所理解的DummyServiceT一样,DummyObj导致public DummyObj fromMNO (MNO<DummyObj> mno)DummyMNOMNO<DummyObj>吗?

是我错了还是有其他可疑的东西?

"solution"将是保留"原始字体"。然后像这样转换

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

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

正如@ seelenvirtuse指出的,是的,不可能改变函数的签名。

但是可以通过使用

来改变所需的类型
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();
}
}

你在DummyService类中重写的frommmno方法与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);
}

最新更新