以下情况
该接口
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中被标记为不可重写。
但就我所理解的DummyService
与T
一样,DummyObj
导致public DummyObj fromMNO (MNO<DummyObj> mno)
和DummyMNO
是MNO<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);
}