我有一个具有两个数据成员的泛型类。这是我写的一段代码
class Calculator<T> {
T num1, num2;
public Calculator(T num1, T num2) {
this.num1 = num1;
this.num2 = num2;
}
}
我想对num1和num2进行简单的算术运算,比如加法和减法,我还想进行简单的二进制运算,比如
但是这是不允许的,那么有人能告诉我如何执行这些任务吗?
不可能;这是你想要做的事情中固有的:把两个数字相加的工作不是你能做的;您不能编写可以将2个任意t添加到一起的代码。
想象一下,你写了一些假设的代码可以做到这一点,然后我邀请了“二维空间复数”,它有一个实部、虚部和一个超虚部:5 10i 20j就是这样一个数字的例子。你可以按你的想法把任何超复数加在一起
5 10i 20j
1 2i 3j
is
6 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代码,传入我的计算器。
您应该使用方法实现接口,例如:
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;
}
}
当然,你们所有的类都应该实现我的号码
简而言之,你不能。
详细的答案是您可以将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中执行此操作。 请帮助我解决这个问题。 问题答案: 使用
问题内容: 我想对两个均扩展Number的相同类型的泛型参数执行操作。 可能吗?我一直习惯在泛型参数上调用方法,但使用运算符似乎存在一些问题(对于参数T,T,运算符+未定义)。 我究竟做错了什么? 编辑:我试图改善我的问题。我知道没有为Number类型定义运算符。这件事有点可悲,因为在不引入@Victor Sorokin建议的新接口的情况下执行这样的操作会很好。 但是我仍然不明白一件事:如果没有在
问题内容: 好的,因此,我正在设置自己的XML序列化(我知道那里还有其他东西,甚至Java中内置了一些东西,但是我自己学习来做,因为可以使用它非常棒)。我已经序列化了。我目前正在进行反序列化(读取XML文件并基于文件中的数据组装对象),并且在设置通用类型时遇到问题。经过广泛研究,我弄清楚了如何获取类的泛型类型,以便在序列化时可以编写它们,但是我不知道如何执行此操作: 我已经在C#中看到了一些答案,
问题内容: 我一直在阅读有关Go中的常量的文章,并且试图了解它们如何在内存中存储和使用。您可以在Go中对非常大的常量执行运算,并且只要结果适合内存,就可以将结果强制为类型。例如,如您所料,此代码显示: 这是如何工作的?在某个时候,Go必须存储并存储在内存中,以便对其执行操作。那么常量是如何存储的,Go如何对其进行算术运算呢? 问题答案: 简短摘要(TL; DR)在答案的结尾。 无类型的任意精度常量