我有一个分配来实现我自己的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);
}
Run Code Online (Sandbox Code Playgroud)
但当然我不能将temp声明为"?"类型.声明为"对象temp_variable"是有道理的,但是最后调用set(temp_variable)将不起作用(因为ListIterator不会使用Object - 因为列表可能不是类型List <Object>).
这对我来说很有意义,然后将temp声明为Object,并强制转换ListIterators:
ListIterator<Object> left_to_right =
(ListIterator<Object>) a_list.listIterator();
ListIterator<Object> right_to_left =
(ListIterator<Object>) a_list.listIterator(list_size);
Run Code Online (Sandbox Code Playgroud)
当我这样做时,编译器给了我未经检查的强制转换警告,但考虑到我的实现,我想不出它会如何破坏.这样做有危险吗?
然后在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);
}
Run Code Online (Sandbox Code Playgroud)
这也给出了未经检查的投射警告.并且考虑更多,即使我仍然得到警告,做一个类似的演员会更安全:
ListIterator<Object> an_iterator = (ListIterator<Object>)a_list.listIterator();
Run Code Online (Sandbox Code Playgroud)
如果列表的泛型类型实际上是E的超类,那么对于List的对象,而不是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);
}
}
Run Code Online (Sandbox Code Playgroud)