当前位置: 首页 > 知识库问答 >
问题:

如何在JAVA中对泛型类型执行算术运算?

陶原
2023-03-14

我有一个具有两个数据成员的泛型类。这是我写的一段代码

class Calculator<T> {
    T num1, num2;
    public Calculator(T num1, T num2) {
        this.num1 = num1;
        this.num2 = num2;
    }
}

我想对num1和num2进行简单的算术运算,比如加法和减法,我还想进行简单的二进制运算,比如

但是这是不允许的,那么有人能告诉我如何执行这些任务吗?

共有3个答案

刁星渊
2023-03-14

不可能;这是你想要做的事情中固有的:把两个数字相加的工作不是你能做的;您不能编写可以将2个任意t添加到一起的代码。

想象一下,你写了一些假设的代码可以做到这一点,然后我邀请了“二维空间复数”,它有一个实部、虚部和一个超虚部:5 10i 20j就是这样一个数字的例子。你可以按你的想法把任何超复数加在一起5 10i 20j1 2i 3jis6 12i 23j

显然,如果不知道我编造的这个超级复数的存在,就不可能编写可以做到这一点的代码。

换句话说,对于任意的“支持加法的事物”,不能使用计算器。你可以专门为超复数构建一个计算器,并编写代码,比如说,一个列表

interface Calculator<T> {
   //  note: Interface. You don't implement it, the user of this library does.

   T add(T a, T b);
   T zero();
}

class ListSummer<T> {
    int sum(List<T> list, Calculator<T> calculator) {
        T answer = calculator.zero();
        for (T item : list) answer = calculator.add(answer, item);
        return answer;
    }
}

然后你可以发布这个库,我可以下载它,然后写下:

class SuperComplex {
    double real, i, j;
}

class SuperComplexCalculator implements Calculator<SuperComplex> {
    public SuperComplex zero() { return new SuperComplex(); }
    public SuperComplex add(SuperComplex a, SuperComplex b) {
        double real = a.real + b.real;
        double i = a.i + b.i;
        double j = a.j + b.j;
        return new SuperComplex(real, i, j);
    }
}

然后使用ListSummer代码,传入我的计算器。

公良俊楚
2023-03-14

您应该使用方法实现接口,例如:

interface MyNumber {
   MyNumber add(MyNumber a, MyNumber b);
   ...
}

然后你可以使用

   class Calculator<T extends MyNumber> {
    T num1, num2;
    public Calculator(T num1, T num2) {
        this.num1 = num1;
        this.num2 = num2;
    }
  }

当然,你们所有的类都应该实现我的号码

晏经武
2023-03-14

简而言之,你不能。

详细的答案是您可以将T的类型限制为特定类型。

  • 为了进行比较,可以将其限制为T
int a = num1.intValue();
int b = num2.intValue();

int sum = a + b;
int diff1 = a - b;
int diff2 = b - a;

最后一种方法的问题是将算术结果返回到T,您需要为此添加一个方法。

 类似资料:
  • 我想执行基本的算术运算,如加法,减法,乘法和除法,每个操作仅使用一个通用方法,用于包装类型,如,,...(不包括和)。 我尝试使用泛型类做如下(用于添加)。 它会发出编译时错误, 运算符不能应用于E,E 有没有办法使用这种通用版本来实现这种操作?

  • 问题内容: 我想对像,,…(不包括和)这样的包装器类型,每个操作仅使用一种通用方法执行基本的算术运算,例如加法,减法,乘法和除法。 我尝试使用泛型类执行以下操作(作为补充)。 它发出一个编译时错误, 运算符+不能应用于E,E 有没有办法使用这种通用版本来实现这种操作? 问题答案: 不,没有办法做到这一点,否则它将内置到Java中。类型系统不够强大,无法表达这种东西。

  • 问题内容: 我在csv文件中有一个日期列,说有这种格式的日期,我还有另外一列。在列中,我要填充紧接在日期列中提到的日期之后的日期。例如。如果date列具有日期,那么我想在Next_Day列中。 我们可以在excel中使用,但我不知道如何在Python中执行此操作。 请帮助我解决这个问题。 问题答案: 使用

  • 问题内容: 好的,因此,我正在设置自己的XML序列化(我知道那里还有其他东西,甚至Java中内置了一些东西,但是我自己学习来做,因为可以使用它非常棒)。我已经序列化了。我目前正在进行反序列化(读取XML文件并基于文件中的数据组装对象),并且在设置通用类型时遇到问题。经过广泛研究,我弄清楚了如何获取类的泛型类型,以便在序列化时可以编写它们,但是我不知道如何执行此操作: 我已经在C#中看到了一些答案,

  • 问题内容: 我想对两个均扩展Number的相同类型的泛型参数执行操作。 可能吗?我一直习惯在泛型参数上调用方法,但使用运算符似乎存在一些问题(对于参数T,T,运算符+未定义)。 我究竟做错了什么? 编辑:我试图改善我的问题。我知道没有为Number类型定义运算符。这件事有点可悲,因为在不引入@Victor Sorokin建议的新接口的情况下执行这样的操作会很好。 但是我仍然不明白一件事:如果没有在

  • 问题内容: 我一直在阅读有关Go中的常量的文章,并且试图了解它们如何在内存中存储和使用。您可以在Go中对非常大的常量执行运算,并且只要结果适合内存,就可以将结果强制为类型。例如,如您所料,此代码显示: 这是如何工作的?在某个时候,Go必须存储并存储在内存中,以便对其执行操作。那么常量是如何存储的,Go如何对其进行算术运算呢? 问题答案: 简短摘要(TL; DR)在答案的结尾。 无类型的任意精度常量