java中类对象之间的强制转换

java中类对象之间的强制转换,java,casting,floating-point,double,Java,Casting,Floating Point,Double,我有两门课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); } } 我想将multiplyBy方法的结果强制转换为Double2,这样最终

我有两门课
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);
  }
}

我想将multiplyBy方法的结果强制转换为Double2,这样最终我就不会有
Float2 newRectangleSize=rectangleSize.multiplyBy(3.2f)
将2个新矩形大小
作为乘法的结果。当然,我可以分别强制转换宽度和高度值,但我想知道java中是否有更高级的解决方案?

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

接口大小{
T宽度();
T高度();
}
另一种选择可能是为这些类提供静态工厂方法,以允许将Double2转换为Float2,反之亦然。它可能看起来像这样

公共类2{
私人最终双宽度;
私人最终双高;
公共双通道2(双宽双高){
这个。宽度=宽度;
高度=高度;
}
公共静态Double2值(浮动2浮动){
返回新的Double2((双)float.width,(双)float.height);
}
}
Float2 Float2=新的Float2(2f,2f)。乘以(2f);
Double2 Double2=Double2.valueOf(float2);

如果
Double2
Float2
是相关类型,则可以进行铸造

只要它们不是,就不能强制转换它们,无论参数的名称是否相同(包括其类型)。但是,您可以将此优势用于基于反射的框架,从而简化类型之间的映射,例如:

如果您不喜欢使用框架(如果只有少数特定和简单的情况),我将提供两种基于纯OOP的基本方法:

  • 使用
    Float2
    Double2
    构造函数(假设字段保持
    public
    ):

  • 在类
    Float2
    中返回此类类型的方法:

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

  • Double2 newRectangleSize=(Double2)rectangleSize.multiplyBy(3.2f)Float2
    可以转换为
    Double2
    ,则code>将起作用。
    @Mapper
    public interface Double2Mapper {
     
        Double2Mapper INSTANCE = Mappers.getMapper(Double2Mapper.class); 
    
        @Mapping
        Double2 floatToDouble(Float2 float2); 
    }
    
    Double2 double2 = Double2Mapper.INSTANCE.floatToDouble(rectangleSize.multiplyBy(3.2f));
    
    public Double2(Float2 float2) {
        this.width = float2.width;
        this.height = float2.height;
    }
    
    public Double2 asDouble2() {
        return new Double2(this.width, this.height);
    }