【问题标题】:How to avoid casting in child classes in java如何避免在java中的子类中进行强制转换
【发布时间】:2021-11-06 17:48:36
【问题描述】:

我想从一个模型进行转换:

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;
   }

【问题讨论】:

  • 我很惊讶调用一个不存在的方法你的代码仍然可以编译。您在 AnswerMapDto 中没有 setValues 方法,让我们从它开始。
  • 除了@stultuske 提到的,getValues 方法都在实现类中?如果这些是由接口定义的,则不需要强制转换。
  • @Stultuske - 我当然有这个方法,但我认为没有必要把它放在这里,因为它对问题并不重要
  • @KoinArab 您在询问它采用的参数类型,但显示您认为不相关的方法本身(包括参数)?
  • 接口Answer中是否有方法Map&lt;String, String&gt; getValues()在子类中实现?

标签: java domain-driven-design


【解决方案1】:

问题是answeranswerDto都是接口的对象,不是实现类。如果接口声明了函数getValuesetValue,则不需要转换。

另外你可以创建一个接口HasValue&lt;T&gt;,它具有public T getValue()public void setValue(T value)的功能,让AnswerAnswerDto实现这个接口。这样做你只需要编写一次代码。

【讨论】:

  • 谢谢。那个通用的、额外的接口正是我所需要的。我也很高兴与其他人相比,你给了我一个机会来填补有问题的缺失信息;)
  • 其他人成功审查了您的问题,我只是假设您的问题将根据审查进行更改。处理您的问题的两个不同部分:)
  • 这不是真的。审查问题应该让作者提供修复。否决和请求结束问题是不同的。
  • 不要把它当作个人。阅读第一个 cmets 我也不确定这个问题是否会得到解决。有很多问题没有达到标准,如果不关闭它们,那么就会充满不好的问题并变得无用。而且我过去也收到过多次反对票,收到负面声誉会激励我变得更好。可以忽略评论,需要尽量减少负面声誉。
猜你喜欢
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多