7

这使用 Eclipse 编译 find:

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 时编译失败:

错误:KeySet 不是抽象的,并且不会覆盖 Set 中的抽象方法 toArray(T[])

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

但是为什么我使用 Ant 编译时它会失败?

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

2 回答 2

2

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

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

并且javacEclipse 都会警告您这个“类型安全”问题。如果您将签名更改为预期的签名,javac 会很高兴。

如果您在 toArray 方法中添加 @Override,即使使用原始Object类型的签名,Eclipse 和javac正确地将其视为对Collection. 所以这个问题不存在。

不一致,我认为的错误javac,是任何子类实现,javac都不识别Object[] toArray(Object[] o)要实现的超级方法<T> T[] toArray(T[] a)。如果它为抽象类做,我也应该为每个子类做。

这不是第一次javac有关于这个的错误。例如,请参阅此线程。我已经搜索了 Oracle 错误数据库,我没有发现任何关于您所发现内容的报告。

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

public Object[] toArray(Object[] o) {
    return super.toArray(o);
}
于 2013-06-12T08:40:01.473 回答
1

在某些情况下,eclipse 编译得很好,而 javac 编译得不好。如果您不介意,我知道使用 Eclipse 编译器构建的三种方法。

  1. 打包 eclipse 预编译的类(hacky,不推荐)

  2. 将 eclipse 编译器适配器与 Ant 一起使用。当您指定属性 build.compiler 后,所有 javac 任务都将在您的 Ant 构建中受到影响。您可以将其设置为“org.eclipse.jdt.core.JDTCompilerAdapter”。请注意,您必须在 ant 构建类路径中包含此类(以及它所依赖的类)。最直接的方法是将必要的 jar 添加到 Ant 安装的 lib 文件夹中

  3. 使用 maven 构建时配置此

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <compilerId>eclipse</compilerId>
                    <compilerVersion>1.6</compilerVersion>
                    <source>1.6</source>
                    <target>1.6</target>
                    <optimize>true</optimize>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.plexus</groupId>
                        <artifactId>plexus-compiler-eclipse</artifactId>
                        <version>2.2</version>
                    </dependency>
                </dependencies>
            </plugin>
    

在 pom.xml 的构建部分的插件部分

于 2013-06-12T09:14:08.433 回答