Rad*_*ium 1 java polymorphism inheritance interface
说我有以下代码示例.我有DataFiller的接口和它的2个实现.每个实现都采用不同类型的容器.
public interface DataFiller {
public void fillContainer(Object param1, Object param2 Object container);
}
public class InOrderDataFiller implements DataFiller {
@Override
public void fillContainer(Object param1, Object param2, Object container) {
if (container instanceof InOrderContainer) {
container.setContent1(param1);
container.setContent2(param2);
}
}
}
public class ReverseDataFiller implements DataFiller {
@Override
public void fillContainer(Object param1, Object param2, Object container) {
if (container instanceof ReverseContainer) {
container.setContent1(param2);
container.setContent2(param1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了确保我可以填充它们,我需要使用instanceof检查容器的数据类型.我想知道,如果有办法,如何有更优雅的代码,比如静态类型检查.有没有办法,如何在DataFiller的具体实现中指定容器的数据类型?我希望代码更像这样(当然这不会编译):
public interface DataFiller {
public void fillContainer(Object param1, Object param2 Container container);
}
public class InOrderDataFiller implements DataFiller {
@Override
public void fillContainer(Object param1, Object param2, InOrderContainer container) {
container.setContent1(param1);
container.setContent2(param2);
}
}
public class ReverseDataFiller implements DataFiller {
@Override
public void fillContainer(Object param1, Object param2, ReverseContainer container) {
container.setContent1(param2);
container.setContent2(param1);
}
}
Run Code Online (Sandbox Code Playgroud)
是的,我可以完全避免使用该界面,只需使用这些实现.界面应该更像模板,如何编写更多填充.我想过使用泛型类型,但我不确定它是否是我需要的.DataFillerFactory是我需要的并在其中执行动态类型检查吗?
正如Sotirios已经评论过的那样,仿制药在这里会有所帮助:
public interface DataFiller<T extends Container> {
void fillContainer(Object param1, Object param2, T container);
}
public class InOrderDataFiller implements DataFiller<InOrderContainer> {
@Override
public void fillContainer(Object param1, Object param2, InOrderContainer container) {
container.setContent1(param1);
container.setContent2(param2);
}
}
public class ReverseDataFiller implements DataFiller<ReverseContainer> {
@Override
public void fillContainer(Object param1, Object param2, ReverseContainercontainer container) {
container.setContent1(param2);
container.setContent2(param1);
}
}
Run Code Online (Sandbox Code Playgroud)
如果它们依赖于容器类型,您还可以为参数类型引入泛型.