如何指定一个既能匹配String又能匹配long的类型?

4
情况是我有一个函数,它调用Arrays.sort对给定的数组进行排序。由于Arrays.sort可以对字符串和长整型进行排序,我希望使用一个单一的签名,而不是两个String[] arraylong[] array
我尝试过类似于Comparable[]的东西,但它不匹配long[]。我也尝试将long改为Long。但装箱和拆箱的过程显著减慢了排序速度。
所以我想知道是否有一种类型可以指定,既匹配它们两个,又普遍适用于Arrays.sort支持的所有类型?

唯一能想到的方法就是将你的长数字存储为String。但问题在于数字和文本数字排序方式不同。也许你可以在问题中添加说明,解释为什么需要这样做。 - Tim Biegeleisen
据我所知,目前尚无法实现这一点 - 实际上,JDK本身针对每种原始数组类型都有一个单独的过载来进行Arrays.sort操作:http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/be44bff34df4/src/share/classes/java/util/Arrays.java - nanofarad
2个回答

3
简短的回答是不行Comparable是一个接口和对象/类系统的一部分。原始类型,如long,不是该系统的一部分,只有它的包装变量Long
不幸的是,即使使用泛型,您也只能将其应用于类,而不能将其应用于原始类型(请参见为什么Java泛型不支持原始类型?)。
因此,在Project Valhalla(值类型)发布之前,如果您想避免自动装箱,则需要提供所有8个基本数据类型(short,int,long,byte,char,float,double,boolean)的硬编码变体。
Java API 也必须这样做。您可以看到Arrays#sort方法有针对所有相关原始类型的重载方法和一个针对类的通用重载方法。从其文档中可以了解到:
sort​(byte[] a)
sort​(char[] a)
sort​(double[] a)
sort​(float[] a)
sort​(int[] a)
sort​(long[] a)
sort​(short[] a)
sort​(Object[] a)
sort​(T[] a, Comparator<? super T> c)

真不敢相信这就是Java的工作方式...我现在真的很想念Python。 - Sraw
这是由于Java中泛型实现的本质所致。不幸的是,当时没有其他方法可以避免破坏向后兼容性(这对于Java来说是一个重要的问题)。 - Zabuzard
是的,我明白这是一个历史问题。不是Java的错。 - Sraw
不过,一旦Valhalla完成,它可能会发生变化 :) - Zabuzard
我多年前学习了Java,在这方面甚至没有任何进展...它只是与那个时候一样。 - Sraw
我同意关于语言的特定部分。然而,其它许多不错的补充也在此期间加入了。 - Zabuzard

0
情况是我有一个函数,它调用Arrays.sort来排序给定的数组。由于Arrays.sort可以对Stringlong进行排序,我想使用单一签名而不是两个String[]数组和long[]数组。
可以尝试像这样进行方法重载
public static void main(String [] args) {
    String [] strs = {"c", "x", "a", "d"};
    long [] ints = {4L, 343660L, 99L, 0L};
    Testing t = new Testing();
    t.sortMyArray(strs);
    t.sortMyArray(ints);
    System.out.println(Arrays.toString(strs)); // [a, c, d, x]
    System.out.println(Arrays.toString(ints)); // [0, 4, 99, 343660]
}

private void sortMyArray(long[] myArray) {
    Arrays.sort(myArray);
}

private void sortMyArray(String[] myArray) {
    Arrays.sort(myArray);
}

这正是我所说的“两个签名”。 - Sraw
在Java中,这是一个方法签名 - 是方法重载的情况。 - prasad_
这是一个带有两个不同签名的方法。或者更具体地说,这是两个拥有相同名称的函数。 - Sraw
如果只有两种类型的数组,可以使用这样的方法,但最好使用重载:public void sortMyArray(String[] strs, long[] ints) { // 有逻辑来排序任何一个或两个数组...}; 调用这样的方法:sortMyArray(strs, ints); - 或 - sortMyArray(null, ints); - 或 - sortMyArray(strs, null); 等等,这变得很繁琐。 - prasad_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接