为了账号安全,请及时绑定邮箱和手机立即绑定

如何指定一个同时匹配 String 和 long 的类型?

如何指定一个同时匹配 String 和 long 的类型?

繁花不似锦 2021-12-22 16:06:55
情况是我有一个函数,它调用Arrays.sort对给定数组进行排序。由于Arrays.sort可以对 String 和 long 进行排序,我想使用一个签名而不是两个String[] array和long[] array。我试过类似的东西Comparable[],它不会匹配long[]。我也尝试更改long为Long. 但是装箱和拆箱的过程显着减慢了排序。所以我想知道是否有一种我可以指定匹配它们的类型?或者通常匹配所有支持的类型Arrays.sort?
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

简短的回答是否定的,你不能。


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)


查看完整回答
反对 回复 2021-12-22
?
米脂

TA贡献1836条经验 获得超3个赞

情况是我有一个函数,它调用Arrays.sort对给定数组进行排序。由于Arrays.sort可以同时对Stringand进行排序long,我想使用一个签名而不是两个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);

}


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信