首页 > 解决方案 > 如何避免在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;
   }

标签: javadomain-driven-design

解决方案


问题是answeranswerDto都是接口的对象,而不是实现类。如果接口声明了函数getValuesetValue.

此外,您可以创建一个HasValue<T>具有 和 功能public T getValue()的接口public void setValue(T value),并让AnswerAnswerDto实现该接口。这样做你只需要编写一次代码。


推荐阅读