继承接口的泛型的数组该如何创建?
来源:1-1 最简单的排序算法:选择排序法
武当王也
2022-01-12 20:09:23
// 这就是选择排序法的第一种方式,从数组中依次挑出最小的,需要注意的是,被拿出来的不能继续后续的挑选。 public static <E extends Comparable<E>> void sort1(E[] data) { E[] empty = (E[])new Object[data.length]; // java 不支持泛型问题描述:数组,通过Object来进行强制类型转化来实现 for(int i = 0; i < data.length; i ++) { // [0, i)是排序的,[i, n)是未排序的 int minIndex = i; for(int j = 0; j < data.length; j ++) { // 处理特殊情况,就是当前i所在的那个位置为null了 if(data[j] == null) continue; if(data[minIndex] == null) { minIndex = j; } if(data[j].compareTo(data[minIndex]) < 0) { minIndex = j; } } // 找到最小的了,将他放入新数组中,他原本所在的位置置为空 empty[i] = data[minIndex]; data[minIndex] = null; } }
上面的这段代码,是我按照每次从数据中获取最小的元素放到一个全新的数组中去,需要用到一个额外的数组空间,但是这段代码
E[] empty = (E[])new Object[data.length];
有点问题无法像后面章节那样进行强转,因为E 实现了Comparable接口导致的。
目前,我通过传参的形式来实现,即sort1(E[] data, E[] empty)。
请问老师,如果我想要设计sort1(E[] data) 如何实现那个额外空间的数组的创建呢?
上述代码编译不报错,运行报错
1回答
因为在的逻辑中,empty 的元素并没有使用 Comparable 的特性,所以直接开 Object 的数组就可以:
Object[] empty = new Object[data.length];
如果你需要使用 Comparable 的特性,可以开 Comparable 的数组:
Comparable[] empty = new Comparable[data.length];
如果你的泛型 E 有更多的约束,可以使用反射中的 Array:
E[] empty = (E[])Array.newInstance(data.getClass().getComponentType(), data.length);
(需要加载 import java.lang.reflect.Array;)
反射是一个大话题,也不在这个课程的范围里,如果你感兴趣,可以寻找更多资料自学。
但其实,如果你的需求特别复杂,就应该考虑使用一个新的类去承载(而非单纯的静态数组),比如用 ArrayList。
继续加油!:)
相似问题