繁体   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