繁体   English   中英

我怎么能指定一个匹配String和long的类型?

[英]How could I specify a type that match both String and long?

情况是我有一个函数,它调用Arrays.sort来对给定的数组进行排序。 由于Arrays.sort可以对String和long进行排序,我想使用一个单一的签名而不是两个String[] arraylong[] array

我尝试过像Comparable[] ,它不会匹配long[] 我也试着改变longLong 但是装箱和拆箱的过程显着减慢了排序速度。

所以我想知道是否有一种我可以指定匹配它们的类型? 或者通常匹配所有支持的Arrays.sort类型?

简短的回答是 ,你不能。

Comparable是一个接口,是对象/类系统的一部分。 诸如long类的原语不是该系统的一部分,只有它的盒装变体Long

不幸的是,你甚至无法使用泛型来解决这个问题,因为它们也只能应用于类,而不能应用于基元(请参阅为什么Java Generics不支持基本类型? )。

因此,在Project Valhalla (值类型)发布之前,如果要避免自动装箱,则需要为所有8个基元( shortintlongbytecharfloatdoubleboolean )提供硬编码变体。没有办法解决。

Java API也必须这样做。 你会看到Arrays#sort重载方法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)

情况是我有一个函数,它调用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);
}

暂无
暂无

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

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