[英]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>
。 在您的情況下,這意味着定義FloatTuple
, IntTuple
等。
目前,在Java中沒有其他方法可以執行此操作...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.