gpt4 book ai didi

java - 为什么 Eclipse 编译这个 Java 代码而不编译 Ant?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:32:35 25 4
gpt4 key购买 nike

使用 Eclipse 编译查找:

abstract class CollectionView implements Collection<Object> {

...
public Object[] toArray(Object[] o) {
if (fast) {
return get(map).toArray(o);
} else {
synchronized (map) {
return get(map).toArray(o);
}
}
}
...
}

class KeySet extends CollectionView implements Set<Object> {

protected Collection<Object> get(Map<Object, Object> map) {
return map.keySet();
}

protected Object iteratorNext(Map.Entry entry) {
return entry.getKey();
}
}

但是使用 Ant 时编译失败:

error: KeySet is not abstract and does not override abstract method toArray(T[]) in Set

我明白为什么代码会使用 Eclipse 进行编译:KeySet 已经从 CollectionView 继承了 toArray(T[]) 方法的实现。

但是为什么用Ant编译会失败呢?

    <javac srcdir="src" destdir="bin" debug="on"> 
<compilerarg value="-Xlint:unchecked"/>
<compilerarg value="-Xlint:deprecation"/>
</javac>

最佳答案

首先我们应该注意预期要实现的方法的确切签名是:

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

两者都是javac Eclipse 会警告您有关此“类型安全”问题的信息。如果您将签名更改为预期的签名,javac 会很高兴。

如果将@Override 放在方法toArray 中,即使使用原始Object 的签名也是如此类型,Eclipse 和 javac正确地将其视为对 Collection 声明的方法的覆盖.所以不存在这个问题。

不一致,我认为是javac的bug ,是任何子类实现,javac无法识别 super 方法 Object[] toArray(Object[] o)实现<T> T[] toArray(T[] a) .如果它适用于抽象类,我也应该适用于每个子类。

不是第一次javac有一个关于这个的错误。看这个thread例如。我搜索了 Oracle 错误数据库,没有发现任何关于您所发现内容的报告。

然后有一个解决方法:在 abstrcat 类中,使用预期的签名;或者在子类中“手动”覆盖:

public Object[] toArray(Object[] o) {
return super.toArray(o);
}

关于java - 为什么 Eclipse 编译这个 Java 代码而不编译 Ant?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17049746/

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