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

时间:2014-08-13 08:26:12

标签: java arrays object primitive

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

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

以下是String函数的示例。

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

对于所有对象类型,我知道我可以像

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

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

由于

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

  

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

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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月在线发布。

答案 4 :(得分:0)

  

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

没有。

但是,您可以使用基元的包装类来实现所需。感谢autoboxing,无需显式创建Wrapper对象。

答案 5 :(得分:0)

我会直截了当地说:不。

请参阅Why don't Java Generics support primitive types?

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

泛型与你能够进入我们在这里谈论的“一体化”的距离非常接近。无论如何,AFAIK,autobox和auto-unbox开销对性能的影响可以忽略不计。