我正在尝试编写一个接受数组并以不同顺序返回数组的函数。
它适用于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
将自动装箱和拆箱用于科学计算或其他对性能敏感的数字代码是不合适的。
答案 0 :(得分:3)
答案 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)
答案 5 :(得分:0)
我会直截了当地说:不。
请参阅Why don't Java Generics support primitive types?
因为需要推断数据的类型,所以你不能随意放置一些布尔值,比如int类型。因为Java是一种类型安全的语言(好吧......有点),所以它们必须被包装并转向后面。
泛型与你能够进入我们在这里谈论的“一体化”的距离非常接近。无论如何,AFAIK,autobox和auto-unbox开销对性能的影响可以忽略不计。