Eclipse如何编译这个Java代码,但不是Ant?

这编译使用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时无法编译:

错误: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>

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

  • 封装eclipse预编译类(hacky,不推荐)

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

  • 当用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的构建部分的插件部分


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

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

    而且javac和Eclipse都会警告你这个'类型安全'问题。 如果您将签名更改为预期签名,那么javac很高兴。

    如果将@Override放入方法toArray,即使使用原始Object类型的签名,Eclipse和javac也会正确地将其视为由Collection声明的方法的重写。 所以这个问题不存在。

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

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

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

    public Object[] toArray(Object[] o) {
        return super.toArray(o);
    }
    
    链接地址: http://www.djcxy.com/p/14037.html

    上一篇: how come Eclipse compiles this Java code but not Ant?

    下一篇: width, layout