在 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);
如果 Double2
和 Float2
是相关类型,则可以进行转换。
只要它们不是,你就不能转换它们,无论参数名称是否相同,包括它们的类型。但是,您可以将此优势用于基于反射的框架,使类型之间的映射变得容易,例如 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的基本方法:
使用 Float2
的 Double2
的构造函数(假设字段保持 public
):
public Double2(Float2 float2) {
this.width = float2.width;
this.height = float2.height;
}
在classFloat2
:
中返回此类类型的方法
public Double2 asDouble2() {
return new Double2(this.width, this.height);
}
我有两个类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);
如果 Double2
和 Float2
是相关类型,则可以进行转换。
只要它们不是,你就不能转换它们,无论参数名称是否相同,包括它们的类型。但是,您可以将此优势用于基于反射的框架,使类型之间的映射变得容易,例如 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的基本方法:
使用
Float2
的Double2
的构造函数(假设字段保持public
):public Double2(Float2 float2) { this.width = float2.width; this.height = float2.height; }
在class
中返回此类类型的方法Float2
:public Double2 asDouble2() { return new Double2(this.width, this.height); }