问题没有出在你的第4行,而是在20行。简单地说,返回的newArray是Object[]类型,而不是Integer[]类型。你的代码和我的课程中的代码的区别在于,我的课程中的代码,从来不会返回一个泛型数组,只会返回一个泛型值。而泛型值和泛型数组,在Java编译器的处理上,有巨大的差异。Java可以自动把泛型值转换成对应的类型,但无法把一个泛型数组自动转换成对应类型的泛型数组。
这不是什么出色的语言特性,在我看来完全属于java语言的坑!要知道,泛型这种语言特性是在Java 5以后才有的,而不是在Java语言设计之初就支持的一种原生语言特性,可能是这个原因,导致Java语言在一些高级特性的使用上(不仅仅是泛型),其实是很不流畅的。。。
Anyway,如果你想返回的是一个泛型数组,到底要怎么做?
1)不使用Java的内置数组,而是自己包装一个MyArray,返回一个新的MyArray。代码类似这样:
public MyArray<E> deleteFrom(MyArray<E> array, int index){
MyArray<E> newArray = new MyArray<E>(array);
newArray.remove(index);
return newArray;
}
2)如果使用Java的内置数组,就需要明确告诉这个函数E是什么类型,比如这样:
public E[] deleteFrom(E[] arr, Class<E> clazz){
// 复制了一份 newArray
E[] newArray = (E[]) Array.newInstance(clazz, arr.length);
for(int i = 0; i < arr.length; i ++)
newArray[i] = arr[i];
// 进行你的逻辑
// ...
return newArray;
}
此时,调用应该是这样的:
Integer[] res = first.deleteFrom(arr, Integer.class);
加油!:)