gpt4 book ai didi

java - Java 中的构造泛型类

转载 作者:行者123 更新时间:2023-12-01 15:40:25 25 4
gpt4 key购买 nike

我有一个运算符类,其中包含一些处理数学运算的类和方法。运算符类是通用的并扩展了 Number,因此我的操作可以使用整数、 double 、 float 等。

public class OperatorClass<T extends Number>

在这个类中有一个抽象类,它提供了一个使用计算方法对数字进行操作的方法

abstract class Op<T extends Number> {
abstract T calculate(DataSet<? extends Number> ds);
}

有多个类扩展 Op,例如 AddOp:

class AddOp<T extends Number> extends Op<T>{
public T calculate(DataSet<? extends Number> ds) {
return ds.getLeft() + ds.getRight();
}
}

我的 DataSet 只是一个数据类,如下所示:

public class DataSet<T extends Number> {
private T left;
private T right;

public DataSet(T left, T right) {
this.left = left;
this.right = right;
}

public T getLeft() {
return left;
}
public T getRight() {
return right;
}

}

我遇到的问题是 ds.getLeft() + ds.getRight() 行未编译,因为 Number 抽象类无法执行 + 运算符。如何使我的数据集成为数字类型(如通配符类),以便我可以对其进行数学运算。

如有任何帮助,我们将不胜感激谢谢

编辑

因此,解决该问题的方法是我使用一些 if 语句,然后获得正确的原始数据类型,如下所示

Number result = null;
if(ds.getLeft().getClass().equals(Integer.class))
result = new Integer(ds.getLeft().intValue() + ds.getRight().intValue());
....
return (T) result;

最佳答案

您必须决定要添加的分辨率。换句话说,您是在调用 left.getInteger() 还是 left.getFloat()

解决这个问题的方法有很多种,但归根结底还是取决于你打算做什么。如果您希望数字真正保留为对象,则不能使用 + 加号运算符,因为它不适用于对象。您需要一个 left.plus(right) 样式方法调用来返回一个新数字。

如果您不关心在数学练习期间将数字维护为对象(也许它们只是为了集合存储或其他原因而使用的对象),那么您可以将 public T getLeft() 替换为public long getLeft() 并依赖内部数字的 left.getLongValue() 进行转换。或者,您只需公开两个 Number 对象并允许“外部”用户执行适当的 getXxxValue() 调用。

关于java - Java 中的构造泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8142640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com