在 java 中的 class 个对象之间进行转换

Casting between class objects in 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;
}

我想将 multiplyBy 方法的结果转换为 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. 使用 Float2Double2 的构造函数(假设字段保持 public):

    public Double2(Float2 float2) {
        this.width = float2.width;
        this.height = float2.height;
    }
    
  2. 在classFloat2:

    中返回此类类型的方法
    public Double2 asDouble2() {
        return new Double2(this.width, this.height);
    }