[英]How to perform Arithmetic operations on Generic type in JAVA?
我有一個帶有兩個數據成員的通用 class。 這是我寫的一段代碼
class Calculator<T> {
T num1, num2;
public Calculator(T num1, T num2) {
this.num1 = num1;
this.num2 = num2;
}
}
我想對 num1 和 num2 執行簡單的算術運算,例如加減法,我還想執行簡單的二進制運算,例如<和> ,但由於它是泛型類型,因此不允許這樣做。
但這是不允許的,那么誰能告訴我如何執行這些任務?
簡短的回答是你不能。
長答案是您可以將T
的類型限制為特定類型。
T extends Comparable<T>
之后您可以num1.compareTo(num2)
T extends Number
,然后對取自 number 的原始類型進行算術運算:int a = num1.intValue();
int b = num2.intValue();
int sum = a + b;
int diff1 = a - b;
int diff2 = b - a;
最后一種方法的問題是將算術結果轉回T
,您需要為此添加一個方法。
您應該使用方法實現接口,例如:
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;
}
}
當然,你所有的類都應該實現 MyNumber
不可能; 這是您嘗試做的事情所固有的:將兩個數字相加並不是您可以做的事情; 您不能編寫可以將 2 個任意 'T' 加在一起的代碼。
想象一下,你寫了一些可以做到的假設代碼,然后我邀請“二維空間復數”,它有一個實部、虛部和一個超虛部: 5 + 10i + 20j
是一個例子這樣一個數字。 您可以按照自己的想法將任何超復數相加; 5 + 10i + 20j
+ 1 + 2i + 3j
是6 + 12i + 23j
。
如果不首先知道我編造的這個超復數的存在,顯然不可能編寫可以做到這一點的代碼。
換句話說,不能用於任意“支持加法的事物”的Calculator
。 您可以專門為 SuperComplex 數字構建一個計算器,並擁有一個包含List<T>
和Calculator<T>
的代碼,因此能夠產生總和:
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 Operations<T> {
T add(T a, T b);
T times(T a, T b);
// ...
}
針對特定類型實現:
class IntOperations implements Operations<Integer> {
Integer add(Integer a, Integer b) { return a + b; }
Integer times(Integer a, Integer b) { return a * b; }
// ...
}
然后將 this 的一個實例傳遞給Calculator
:
public Calculator(T num1, T num2, Operations<T> ops) {
並根據需要調用ops
上的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.