java - 在 java 方法中使用泛型时如何正确转换?

标签 java generics

我有一项任务是实现我自己的 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/