我有一项任务是实现我自己的 Collections.fill() 和 Collections.reverse() 版本。算法很简单,但我对所涉及的泛型有点迷失,特别是当我需要进行转换时。
我最初的想法是这样的:
public static void reverse(List<?> a_list) {
int list_size = a_list.size();
ListIterator<?> left_to_right = a_list.listIterator();
ListIterator<?> right_to_left = a_list.listIterator(list_size);
? temp_variable;
// ..doing some stuff
right_to_left.set(temp_variable);
}
但是我当然不能将临时文件声明为“?”类型。声明为“Object temp_variable”是有道理的,但是最后调用 set(temp_variable) 将不起作用(因为 ListIterator 不会采用 Object——因为列表可能不是 List
这对我来说很有意义,然后将 temp 声明为一个对象,并强制转换 ListIterators:
ListIterator<Object> left_to_right =
(ListIterator<Object>) a_list.listIterator();
ListIterator<Object> right_to_left =
(ListIterator<Object>) a_list.listIterator(list_size);
当我这样做时,编译器会给我未经检查的转换警告,但考虑到我的实现,我想不出这会如何中断。这样做有什么危险吗?
然后在 Collections.fill() 中,我本来想做这样的事情:
public static <E> void fill(List<? super E> a_list, E an_object) {
ListIterator<E> an_iterator = (ListIterator<E>) a_list.listIterator();
// ..doing some stuff
an_iterator.set(an_object);
}
这也给出了未经检查的强制转换警告。再考虑一下,即使我仍然收到警告,做这样的转换是否更安全:
ListIterator<Object> an_iterator = (ListIterator<Object>)a_list.listIterator();
如果列表的通用类型实际上是 E 的父类(super class),则将对象列表转换为 ListIterator 应该更安全,而不是为列表通用类型的子类转换为 ListIterator,不是吗? ?
如有任何建议,我们将不胜感激...我不认为我们的导师希望我们参与其中,但我想更好地理解泛型。
最佳答案
不强制转换,也不使用 ?
。使用类型参数化方法;像这样。
public static <T> void reverse(List<T> a_list) {
int list_size = a_list.size();
ListIterator<T> left_to_right = a_list.listIterator();
ListIterator<T> right_to_left = a_list.listIterator(list_size);
T temp_variable;
while(left_to_right.nextIndex() < list_size / 2) {
temp_variable = left_to_right.next();
left_to_right.set(right_to_left.previous());
right_to_left.set(temp_variable);
}
}
关于java - 在 java 方法中使用泛型时如何正确转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9102219/