2015-03-02 165 views
0

我目前使用兩個類都代表一個數據結構(像一個特殊的緩衝區,但爲了簡單在這個例子中,讓我們假設三字段)工作在本地類型;一個是long,另一個是float(所以兩者都在處理本機類型)。爲了避免代碼加倍,直接的方法是在類型<T>上實現泛型,然後有兩個用戶,一個用於<long>,一個用於<float>Java中的本機類型(原語)的泛型(或其他方法)

AFAIK這是不可能的本地類型;只有從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;)。

有沒有其他的方法來避免代碼加倍否則不可避免?甚至有可能是一個最佳實踐如何解決這樣的問題?

+0

你可以簡單地使用包裝類'Float','Integer', '長'等 – Dragondraikk 2015-03-02 13:23:02

+0

由於性能方面的原因,我只是添加了需要堅持原生類型的信息。 – Alfe 2015-03-02 13:23:56

+0

不可能,因爲泛型意味着要與對象一起工作。 – SMA 2015-03-02 13:25:28

回答

1

基元不可能。看看一些內置的API,它們充斥着不同基元的各種版本的方法。理論上講,你可以有一個具有6個私有變量和所有風格的類,但這看起來比兩個單獨的「乾淨」類更醜陋。

你可能可以用Lambdas做些事情來解決這個問題,但我並不確定。

1

原始數字類型不能用作泛型的參數(由於泛型定義的方式)。此外,你定義了sum(),所以我不確定你打算如何處理不是「可以和」的類型。

是的,依靠自動裝箱是昂貴的,這是一個不可否認的事實;是的,基元沒有對象標識,所以與C#不同,例如不能有List<int>(甚至沒有談論類型擦除)。

這就是爲什麼Java 8的實現已經定義了例如IntStream來「補充」Stream<Integer>。對你來說,這將意味着定義FloatTupleIntTuple

目前,還沒有其他方法在Java中做到這一點...