【问题标题】:Casting between class objects in javajava中类对象之间的转换
【发布时间】:2020-08-27 17:28:51
【问题描述】:

我有两个班级Float2 && Double2

public final class Float2 {
  public float width;
  public float height;
    
  public Float2 multiplyBy(float number) {
    return new Float2(this.width * number, this.height * number);
  }
}
public class Double2 {
  public double width;
  public double height;
}

我想将 multiplyBy 方法的结果转换为 Double2,这样最后我就没有 Float2 newRectangleSize = rectangleSize.multiplyBy(3.2f); 而是 Double2 newRectangleSize 作为乘法的结果。当然,我可以分别转换宽度和高度值,但我想知道 java 中是否有更优雅的解决方案?

【问题讨论】:

  • 如果Float2 可以转换为Double2Double2 newRectangleSize = (Double2) rectangleSize.multiplyBy(3.2f); 将起作用。

标签: java casting floating-point double


【解决方案1】:

如果 Double2Float2 是相关类型,则可以进行强制转换。

只要不是,您就不能强制转换它们,无论参数名称是否相同,包括它们的类型。但是,您可以将此优势用于基于反射的框架,使类型之间的映射变得容易,例如MapStruct

@Mapper
public interface Double2Mapper {
 
    Double2Mapper INSTANCE = Mappers.getMapper(Double2Mapper.class); 

    @Mapping
    Double2 floatToDouble(Float2 float2); 
}
Double2 double2 = Double2Mapper.INSTANCE.floatToDouble(rectangleSize.multiplyBy(3.2f));

如果您不热衷于使用框架(仅在少数特定和简单的情况下),我提供了两种基于纯 OOP 的基本方法:

  1. 使用Float2Double2 的构造函数(假设字段保持public):

    public Double2(Float2 float2) {
        this.width = float2.width;
        this.height = float2.height;
    }
    
  2. Float2中返回此类类型的方法:

    public Double2 asDouble2() {
        return new Double2(this.width, this.height);
    }
    

【讨论】:

    【解决方案2】:

    很明显,在这种情况下尝试强制转换将导致ClassCastException。一种选择是支持由两个类实现的接口,该接口允许将 width() 和 height() 定义为 Number 对象,甚至是扩展 Number 的类型。然后,您可以逐个实现地处理转换,以处理 int 或 short 等情况下的精度损失。

    interface Size<T extends Number> {
    
        T width();
    
        T height();
    
    }
    

    另一种选择可能是为这些类提供静态工厂方法,以允许将 Double2 转换为 Float2,反之亦然。它可能看起来像这样;

    public class Double2 {
        
        private final double width;
    
        private final double height;
    
        public Double2(double width, double height) {
            this.width = width;
            this.height = height;
        }
    
        public static Double2 valueOf(Float2 float) {
            return new Double2((double) float.width, (double) float.height);
        }
    
    }
    
    Float2 float2 = new Float2(2f, 2f).multiplyBy(2f);
    
    Double2 double2 = Double2.valueOf(float2);
    

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 1970-01-01
      • 2020-02-17
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2013-09-05
      • 1970-01-01
      相关资源
      最近更新 更多