使用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>
答案 0 :(得分:2)
首先,我们应该注意到预期实施的方法的确切签名是:
<T> T[] toArray(T[] a);
javac
和Eclipse都会警告你这个'类型安全'问题。如果您将签名更改为预期签名,javac很高兴。
如果将@Override放入方法toArray,即使使用原始Object
类型的签名,Eclipse和javac
也会正确地将其视为{{1}声明的方法的覆盖}}。所以这个问题不存在。
不一致,我认为Collection
的错误是任何子类实现,javac
无法识别超级方法javac
来实现Object[] toArray(Object[] o)
。如果它是为抽象类做的,我也应该为每个子类做。
这不是第一次<T> T[] toArray(T[] a)
有关于此的错误。例如,请参阅此thread。我搜索了Oracle错误数据库,但没有发现任何关于你发现的内容的报道。
然后有一个解决方法:在abstrcat类中,使用预期的签名;或者在子类中重写'manual`:
javac
答案 1 :(得分:1)
有几种情况下eclipse编译得很好而javac没有。如果您不介意,我知道使用eclipse编译器构建三种方法。
打包eclipse预编译类(hacky,不推荐)
将eclipse编译器适配器与Ant配合使用。当您指定属性build.compiler时,此后所有javac任务都将受到Ant构建的影响。您可以将其设置为&#34; org.eclipse.jdt.core.JDTCompilerAdapter&#34;。请注意,您必须在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的构建部分的插件部分