簡體   English   中英

Java 抽象基元數組加法

[英]Java abstract primitive array addition

當給定原始 arrays 時,

int[] iArr = new int[]{0,1,2,3,4};
long[] lArr = new int[]{0,1,2,3,4};
double[] dArr = new int[]{0,1,2,3,4};

並且每個由供應商提供,

class IarrSupplier {
  int[] supply();
}

class LarrSupplier {
  long[] supply();
}

class DarrSupplier {
  double[] supplyer();
}

如何以抽象的方式將它們全部添加?

interface PSupplier<T> {
  T[] supply();
}

提供者是實現PSupplier<T>

class IarrSupplier implements PSupplier<int> {
  int[] supply();
}

class LarrSupplier implements PSupplier<long[]> {
  long[] supply();
}

class DarrSupplier implements PSupplier<double[]> {
  double[] supplyer();
}

我知道 java 不支持原始類型泛型。 所以上面根本不起作用。

但如果它有效,我希望這樣做,

// same or several type of PSuppliers will be provided.
PSupplier[] suppliers = polymorphsSuppliers();

long[] totalSumArray = [my_fixed_length];
for(PSupplier supplier : suppliers){
  for(int i = 0 ; i < totalSumArray.length ; i++){
    totalSumArray[i] += supplier.supply()[i];
  }
}

有什么可能/更好的設計來做到這一點?

簡而言之,

  • 將給出多個 int[] 或 long[](或更多可求和的原始類型數據)。
  • 我想得到所有這些。
  • 我想做一個 long[] 來累積給定 arrays 的所有相同索引值。

我不知道您到底想做什么,但是我可以看到有關您的代碼的幾個問題。 我猜你想遍歷一個一維數組,所以,在接口PSupplier中,不需要聲明返回數組T[]的方法,所以固定代碼是:

interface PSupplier<T> { T supply(); }

現在從 PSupplier 接口實現的下一個類,它們的泛型類型必須是您想要的數據類型的數組,例如:

class IarrSupplier implements PSupplier<int[]> {
    @Override
    public int[] supply() {
        return new int[]{1,2,3,4,5,6,7};
    }
}

請記住,generics 只接受對象,並且,除非在 java 中,否則數組是 object,它的類型是否正確並不重要,PSupplier 類型是否正確,所以, [int] . 或者您可以使用PSupplier<Integer[]>並且也是正確的,因為 Integer 是 int 數據類型的包裝 class 。 如果您不了解 java 中的包裝類,我建議您閱讀: java 中的包裝類

對於方法polymorphsSuppliers()必須返回一個PSupplier數組,例如:

** here, the polymorphism is working **

  PSupplier[] polymorphsSuppliers(){
    return new PSupplier[]
    {
        new IarrSupplier(),
        new LarrSupplier(),
        new DarrSupplier(),
        ......
    };
}

關於你在 for 循環中的代碼,我不明白你到底想做什么。 但我希望我輸入的示例對您有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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