gpt4 book ai didi

java - 当返回类型为 List 时,无法覆盖父类(super class)中的方法

转载 作者:行者123 更新时间:2023-12-01 12:06:36 24 4
gpt4 key购买 nike

当我想返回 C2ArrayList 时,这是不可能的,因为返回类型不兼容。

package a;
class C1 {
private final ArrayList<C2> c2s = new ArrayList<C2>();

protected ArrayList<C2> getC2() { return c2s; }
}

class C2 {}

package b;
class C1 extends a.C1 {
private final ArrayList<C2> c2s = new ArrayList<C2>();

@Override
protected ArrayList<C2> getC2() { return c2s; } // won't work
}

class C2 extends a.C2 {}

更新:为什么这不起作用,当以下工作(在a.C1和b.C1中)时:

private final C2 c2 = new C2();

public C2 getC2() { return c2; }

最佳答案

你有两个不同的C2类-一个ArrayList<a.C2>ArrayList<b.C2> 不同。它们是不兼容的,以避免此类事情发生:

ArrayList<b.C2> listB = new ArrayList<b.C2>();
ArrayList<a.C2> listA = listB; // This is invalid...
listA.add(new a.C2());
b.C2 firstElement = listB.get(0); // To stop this from causing problems.

这与重写无关,它只是普通的泛型。您可以在 a.C1 中更改您的声明至:

protected ArrayList<? extends C2> getC2() { return c2s; }

然后就可以了,因为类型是兼容的。这可以防止上述滥用,因为您无法调用 addArrayList<? extends a.C2>上.

顺便说一句,我强烈不鼓励您使用仅通过包来区分的类名。这是导致不可读的代码和痛苦的调试 session 的秘诀。这也是解决难以阅读的问题的秘诀,因此如果您的真实代码不使用这种令人讨厌的命名方案,请不要让您的示例代码使用它。

关于java - 当返回类型为 List 时,无法覆盖父类(super class)中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27545599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com