java - 在 ArrayList<? 定义的方法中交换两个子级扩展父级>

标签 java inheritance arraylist polymorphism

我的问题是基于上一个问题的答案:

Why we can't do List<Parent> mylist = ArrayList<child>();

我有一个函数,可以根据父函数中的参数对传递给它的子函数列表进行排序。由于有许多不同类型的子级,我编写了一个接收通用父级类型的函数。

void sort(ArrayList<? extends Parent> passedList)

在函数的后面,我想交换 ArrayList 的两个成员(i 和 j),但我不知道如何交换。我尝试过:

Parent swap;
swap = passedList.get(i);
passedList.set(i,passedList.get(j));
passedList.set(j,swap);

但是这不会编译,它表示类型在 set 函数中不兼容。我从 get 收到的类型是 Parent,但 set 需要 (? extends Parent) 类型。我也尝试过将交换声明为 ?扩展父交换; 或通过强制转换如

passedList.set(i,(? extends Parent)passedList.get(j));

看起来应该可以看到我们如何保证 passList.get() 返回的对象是属于数组列表的正确类型。

最佳答案

It seems like it should be possible seeing as how we can guarantee that the object returned by passedList.get() is the right type to belong in the arraylist.

我们可以说它是正确的,因为我们可以查看代码并追溯到 swap 的位置。来自。但编译器无法判断,因为它不受语言保证。您正在尝试输入 ParentList<? extends Parent> ,并且列表可能是某种子类型,例如 List<Child> .

相反,您可以通过通配符捕获来完成此操作:

static <P extends Parent> void swap(List<P> list, int i, int j) {
    P temp = list.get(i);
    list.set(i, list.get(j));
    list.set(j, temp);
}

这可以让您表达 temp 的类型与 list 的实际类型参数相同.

另请参阅:

关于java - 在 ArrayList<? 定义的方法中交换两个子级扩展父级>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27082781/

相关文章:

java - apk转jar后如何访问资源(R.class)

java - 从 jar 运行 opengl jogamp

java - 在 Tomcat 上运行 SolrCloud 时出现 FileNotFoundException

java - 将 3 个列表组合成具有唯一值的单个集合

java - 如何获取存储在ArrayList<HashMap<key,value>>中的值?

java - 绕过 Java 闭包最终限制的模式

java - 接口(interface)是否扩展了Object类?

class - 访问父类(super class)的成员函数

php - 如何在 Doctrine2 中为类表继承指定外键列?

java - 在 Java 中搜索两个 arrayList 索引之间的通用项