gpt4 book ai didi

java - List 重写 toArray 最终作为 T1[] toArray

转载 作者:搜寻专家 更新时间:2023-11-01 08:20:57 25 4
gpt4 key购买 nike

我试图通过在类中实现 List 接口(interface)来稍微调整 List。

我可以毫无问题地重写和实现所有方法,除了这个:

<T> T[] toArray(T[] a);

Android Studio 在覆盖时向我展示了这段代码,创建了一个新类型 T1。为什么会这样,有什么作用?

@NonNull
@Override
public <T1> T1[] toArray(@NonNull T1[] a) {
return inner.toArray(a);
}

当鼠标悬停在 a 参数上时,我看到了这个 lint 警告:

Array of type java.lang.Object expected

当我尝试将其手动更改回 T[] 而不是 T1[] 时,我收到此错误:

toArray(T[])' in 'QueryList' clashes with 'toArray(T[])' in 'java.util.List'; both methods have same erasure, yet neither overrides the other

这是 Android Studio/intelliJ 中的一个错误,它无法正确创建覆盖,还是我遗漏了什么?

编辑:这里是类的声明,包括T和使用的地方。

public class QueryList<T> implements List<T> {

//<editor-fold desc="inner list & constructors">
protected final List<T> inner;

public QueryList() {
inner = new ArrayList<>();
}

public QueryList(int initialCapacity) {
inner = new ArrayList<>(initialCapacity);
}

public QueryList(@NonNull Collection<? extends T> c) {
inner = new ArrayList<>(c);
}
//</editor-fold>

感谢您的帮助。

最佳答案

No other T involved

你的 QueryList类声明了一个类型参数,它也被命名为 T ,因此 intellij 可能会将覆盖中的那个重命名为 T1明确表明它是不同的。

请注意 toArray List还声明了它自己的类型参数,这也是正确覆盖所必需的:

<T> T[] toArray(T[] a);
^^^

我猜你的修复也像这样删除了类型参数声明:

T[] toArray(T[] a);

但这将不再使它成为覆盖,因为类型参数必须匹配。根据 jls 8.4.8.1 :

An instance method mC declared in or inherited by class C, overrides from C another method mA declared in class A, iff all of the following are true:

...

  • The signature of mC is a subsignature (§8.4.2) of the signature of mA.

并且在 8.4.2 :

Two methods or constructors, M and N, have the same signature if they have the same name, the same type parameters (if any) (§8.4.4), and, after adapting the formal parameter types of N to the the type parameters of M, the same formal parameter types.

而且子签名的概念在强调的部分也不再宽松。


当我将其更改为 <T> T[] toArray(T[] a); 时,我收到类型参数 T 的警告声明从封闭类中隐藏了一个,但将名称更改为 T1让它消失。

至于为什么签名是这样的,一种解释是您想要使用父类(super class)型数组来收集列表的元素。例如:

class A {}
class B extends A {}

List<B> list = ...
A[] elements = list.toArray(new A[0]); // should still work, no need to pass a `B[]` strictly.

关于java - List<T> 重写 toArray 最终作为 T1[] toArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51206451/

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