簡體   English   中英

如何對 JAVA 中的泛型類型進行算術運算?

[英]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 + 3j6 + 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM