簡體   English   中英

Java中本機類型(原始)的泛型(或替代方法)

[英]Generics for Native Types (Primitives) in Java (or alternative approaches)

我當前正在使用兩個類,它們都表示一個數據結構(就像一個特殊的緩沖區,但在本例中為簡單起見,假設三個字段)在本機類型上工作。 一個用於long ,另一個用於float (因此兩者都適用於本機類型)。 為了避免代碼加倍,直接的方法是在類型<T>上實現泛型,然后有兩個用戶,一次用於<long> ,一次用於<float>

AFAIK這對於本機類型是不可能的; 只有從Object派生的Object才有可能。

是否有其他方法可以避免代碼加倍,否則是不可避免的? 由於性能方面的原因,不能選擇使用非本地類型(例如Integer )。

當前代碼簡化為僅具有三個字段的最小示例:

public class TupleFloat {
  private float field1;
  private float field2;
  private float field3;
  public TupleFloat(float a, float b, float c) {
    field1 = a; field2 = b; field3 = c;
  }
  public float sum() {
    return field1 + field2 + field3;
  }
}

public class TupleLong {
  private long field1;
  private long field2;
  private long field3;
  public TupleLong(long a, long b, long c) {
    field1 = a; field2 = b; field3 = c;
  }
  public long sum() {
    return field1 + field2 + field3;
  }
}

使用泛型:

public class Tuple<T> {
  private T field1;
  private T field2;
  private T field3;
  public Tuple<T>(T a, T b, T c) {
    field1 = a; field2 = b; field3 = c;
  }
  public T sum() {
    return field1 + field2 + field3;
  }
}

但這不適用於本機類型( Tuple<float> x; )。

是否有其他方法可以避免代碼加倍,否則是不可避免的? 也許甚至有最佳實踐來解決這個問題?

對於原語是不可能的。 看一下一些內置的API,它們雜亂無章地顯示了針對不同原語的各種方法版本。 從理論上講,您可以有一個包含6個私有變量和所有樣式的類,但這似乎比兩個單獨的“干凈”類丑陋。

您也許可以使用Lambdas做一些事情來解決這個問題,但是我不確定。

原始數字類型不能用作泛型的參數(由於泛型的定義方式)。 另外,您定義sum() ,所以我不確定您打算對不是“ summable”的類型做什么。

是的,依靠自動裝箱很昂貴,這是不容否認的事實。 是的,基元沒有對象標識,因此與C#不同,例如,您不能擁有List<int> (甚至不談論類型擦除)。

這就是為什么對於Java 8,實現將例如IntStream定義為“補充” Stream<Integer> 在您的情況下,這意味着定義FloatTupleIntTuple等。

目前,在Java中沒有其他方法可以執行此操作...

暫無
暫無

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

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