为通用数组包装原语时出现未经检查的强制转换警告
Unchecked cast warning when wrapping primitives for generic array
我正在编写一个小的排序函数包,用于 class SortableArray<T extends Comparable<T>>
的对象,因为我希望能够对像 int
这样的原始对象进行排序,我需要将基元包装在 class 对象中,在本例中具体为 Integer
。因此,我重载了我的构造函数以获取类型 int
的数组,将每个数组包装在 Integer
中,将其存储在数组 temp
中,然后将 GenList
指向 temp
。我添加了一个 (T[])
的转换以使 IDE 快乐,但现在我有一个未经检查的类型警告。
这是我的代码:
package sorts;
public class SortableArray<T extends Comparable<T>> {
T[] GenList;
public SortableArray(T[] theList) {
GenList = theList;
}
public SortableArray(int[] theList) {
Integer[] temp = new Integer[theList.length];
for(int i = 0; i < theList.length; i++) {
temp[i] = new Integer(theList[i]);
}
GenList = (T[]) temp; //warning here
}
}
我应该只抑制警告,还是有更安全的方法?
感谢您的回复。
这可能有问题的原因是如果我尝试做这样的事情:
SortableArray<String> array = new SortableArray<>(new int[] { 3, 9, 9 });
它看起来很荒谬,但它是完全合法的,当你想在其他地方使用它时会咬你。
您可能想要考虑的是静态工厂方法,它可能看起来像这样:
public static SortableArray<Integer> createSortableArrayFromInts(int[] theList)
{
Integer[] temp = new Integer[theList.length];
for(int i = 0; i < theList.length; i++) {
temp[i] = Integer.valueOf(theList[i]);
}
return new SortableArray<Integer>(temp);
}
我正在编写一个小的排序函数包,用于 class SortableArray<T extends Comparable<T>>
的对象,因为我希望能够对像 int
这样的原始对象进行排序,我需要将基元包装在 class 对象中,在本例中具体为 Integer
。因此,我重载了我的构造函数以获取类型 int
的数组,将每个数组包装在 Integer
中,将其存储在数组 temp
中,然后将 GenList
指向 temp
。我添加了一个 (T[])
的转换以使 IDE 快乐,但现在我有一个未经检查的类型警告。
这是我的代码:
package sorts;
public class SortableArray<T extends Comparable<T>> {
T[] GenList;
public SortableArray(T[] theList) {
GenList = theList;
}
public SortableArray(int[] theList) {
Integer[] temp = new Integer[theList.length];
for(int i = 0; i < theList.length; i++) {
temp[i] = new Integer(theList[i]);
}
GenList = (T[]) temp; //warning here
}
}
我应该只抑制警告,还是有更安全的方法?
感谢您的回复。
这可能有问题的原因是如果我尝试做这样的事情:
SortableArray<String> array = new SortableArray<>(new int[] { 3, 9, 9 });
它看起来很荒谬,但它是完全合法的,当你想在其他地方使用它时会咬你。
您可能想要考虑的是静态工厂方法,它可能看起来像这样:
public static SortableArray<Integer> createSortableArrayFromInts(int[] theList)
{
Integer[] temp = new Integer[theList.length];
for(int i = 0; i < theList.length; i++) {
temp[i] = Integer.valueOf(theList[i]);
}
return new SortableArray<Integer>(temp);
}