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