Java类对象之间的转换

问题描述

我有两个班级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;
}

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

解决方法

因此显然,在这种情况下尝试强制转换将导致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);
,

如果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. 使用Double2的{​​{1}}的构造函数(假设字段保留为Float2):

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

    Float2