繁体   English   中英

用于处理对象和基元的java函数

[英]java function that work with objects and primitives

我正在尝试编写一个接受数组并以不同顺序返回数组的函数。

它适用于int,double,string,object或数组中的任何对象。

以下是String函数的示例。

public String[] randomize(String[] array, int randomKey)
{
    //algorithm here
    return newStringArray;
}

对于所有的Object类型,我知道我可以这样做

public Object[] randomize(Object[] array, int randomKey)
{
    //algorithm here
    return newObjectArray;
}

而不是将所有基本类型装入对象,是否有任何其他方法我可以只编写一次算法而不为每个基元数组创建函数? 是否存在适用于对象和原语的通用数组类型?

谢谢

PS由于性能损失,不想使用自动装箱。 引自[autoboxing]: http//docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

将自动装箱和拆箱用于科学计算或其他对性能敏感的数字代码是不合适的。

可悲的是,泛型不会在这里工作,因为泛型不包括原语,但它们确实涵盖了原始数组。 原始数组也不会自动装箱到包装类数组中。 这是你必须手动完成的事情,但这非常慢。 一种解决方案是为每个基元提供覆盖,类似于Arrays.sort的实现方式。 这会产生大量重复的代码。 另一种解决方案是使用类似于ArrayList的Array接口来模拟Array,获取/设置索引的方法,并为每个基元提供子类,为对象提供一个子类。 然后,您可以使用Array接口,而不关心实际类型。

尝试使用标准容器类,如ArrayList。 这些现在可以使用基元(通过自动将它们视为包装器对象,例如Integer)和任何其他对象。

如果你想将原始类型传递给你的方法,那么你必须为每个基本类型编写一个方法,没有办法只用一个方法来做,我认为如果有方法,那么我们会找到它在Java API中的一些示例中,但是如果我们检查示例Arrays ,则每个基元都有Arrays.copyOf方法。

有一个使用反射的选项,但在这种情况下你将失去所有类型安全的方法:

public Object randomize(Object array, int randomKey) {
  if (array.getClass().isArray()) {
    int length = Array.getLength(array);
    for (int i = 0; i < length; i ++) {
      Object arrayElement = Array.get(array, i);
      // do something with array
    }
    return // result
  } else {
    throw new IllegalArgumentException();
  }
}

这个实现利用了甚至int[]继承自Object的事实。

或者,您可以重载函数,以便将每个基本数组类型隐式转换为盒装版本。

public int[] randomize(int[] array, int randomKey) {
  return toIntArray(randomize(toIntegerArray(array), randomKey));
}

这是Java类型系统的一个已知限制,它目前由JVM的架构师解决。 今年的JVMLS在这件事上有一个很棒的演讲。 该演示文稿将于9月份上线。

是否存在适用于对象和原语的通用数组类型?

没有。

但是,您可以使用基元的包装类来实现所需。 由于自动装箱 ,不需要显式创建Wrapper对象。

我会直截了当地说:不。

请参阅为什么Java Generics不支持基元类型?

因为需要推断数据的类型,所以不能随意放置一些布尔值,比如int类型。 因为Java是一种类型安全的语言,所以它们必须被包装并转向后面(好吧......有点)

仿制药就像你能够达到我们在这里谈论的“一体化”一样接近。 无论如何,AFAIK,autobox和auto-unbox开销对性能的影响可以忽略不计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM