java - 如何避免在java中的子类中进行强制转换
问题描述
我想从一个模型进行转换:
public class AnswerDto { }
public class AnswerMapDto extends AnswerDto {
private Map<String, String> values;
public Map<String, String> getValues() {
return values;
}
public void setValues(Map<String, String> values) {
this.values = values;
}
}
给另一个:
public interface Answer { }
public class AnswerMap implements Answer {
private Map<String, String> values;
public Map<String, String> getValues() {
return values;
}
public void setValues(Map<String, String> values) {
this.values = values;
}
}
我以我为每个孩子创建转换器的方式完成了它,并且在这个转换器中强制转换是必要的。你知道我怎样才能避免这种铸造吗?
public class AnswerMapConverter implements AnswerConverter {
@Override
public AnswerDto toDto(Answer answer) {
AnswerMapDto answerMapDto = new AnswerMapDto();
answerMapDto.setValues(((AnswerMap) answer).getValues());
return answerMapDto;
}
@Override
public Answer toModel(AnswerDto answerDto) {
return new AnswerMap(((AnswerMapDto)answerDto).getValues());
}
}
经过一些评论后,我意识到将有另一个具有不同返回类型的子类 getValues() 方法。例如。
public String getValues() {
return values;
}
解决方案
问题是answer
和answerDto
都是接口的对象,而不是实现类。如果接口声明了函数getValue
和setValue
.
此外,您可以创建一个HasValue<T>
具有 和 功能public T getValue()
的接口public void setValue(T value)
,并让Answer
和AnswerDto
实现该接口。这样做你只需要编写一次代码。
推荐阅读
- python - 如何使用 df.to_html 删除“数据框”类?
- c# - 是否可以将占位符文本添加到用户输入文本框?
- angular - 过滤Angular 6 mat-select值不重置原始数组
- r - 根据条件连接不同表中的列
- python - 如何定义和初始化一个 numpy 元组矩阵?
- sql-server - 如果使用视图,更新 Azure 搜索文档会更新我的数据库
- android - 关于 onCreate() 的问题?
- ruby - Ruby 等待进程退出
- android - 找不到builder.jar (com.android.tools.build:builder:3.0.1)
- node.js - NodeJs Express - 将请求参数传递给护照身份验证