[英]How do I specify both an interface and its type parameters when requesting & referencing a service in OSGi DS?
[英]How could I specify a type that match both String and long?
情况是我有一个函数,它调用Arrays.sort
来对给定的数组进行排序。 由于Arrays.sort
可以对String和long进行排序,我想使用一个单一的签名而不是两个String[] array
和long[] array
。
我尝试过像Comparable[]
,它不会匹配long[]
。 我也试着改变long
到Long
。 但是装箱和拆箱的过程显着减慢了排序速度。
所以我想知道是否有一种我可以指定匹配它们的类型? 或者通常匹配所有支持的Arrays.sort
类型?
简短的回答是不 ,你不能。
Comparable
是一个接口,是对象/类系统的一部分。 诸如long
类的原语不是该系统的一部分,只有它的盒装变体Long
。
不幸的是,你甚至无法使用泛型来解决这个问题,因为它们也只能应用于类,而不能应用于基元(请参阅为什么Java Generics不支持基本类型? )。
因此,在Project Valhalla (值类型)发布之前,如果要避免自动装箱,则需要为所有8个基元( short
, int
, long
, byte
, char
, float
, double
, boolean
)提供硬编码变体。没有办法解决。
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
可以对String
和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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.