2013-06-11 23 views
7

Bu Eclipse kullanarak bulmak derler:Eclipse bu Java kodunu nasıl derler ama Ant'i değil?

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(); 
     } 
    } 

ama Ant kullanırken derlenmeyecektir: anahtar kümesi zaten ToArray uygulanmasını devralır: Kod Eclipse kullanarak derlemek neden

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

Ben görebilirsiniz CollectionView'den (T []) yöntemi.

Ancak Ant'i kullanarak derlediğimde neden başarısız oluyor?

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

Bu zor bir şey. Bağımlılıklarda veya bağımlılık düzeninde bazı farklar olmalı? – djangofan

+0

emin değil. ama her iki sınıf da aynı sınıfın iç sınıflarıdır. –

+0

Kapsanan sınıf "toArray()" işlevini uyguluyor mu? –

cevap

1

çeşitli durumlar vardır. Eğer sakıncası yoksa, eclipse derleyicisini kullanarak oluşturmayı bildiğim üç yol var.

  1. Paket önceden derlenmiş sınıfları (tavsiye DEĞİL, hacky)

  2. Ant Tutulma derleyici adaptörü kullanın Tutulma. Property.compiler özelliğini belirttiğinizde, bundan sonra tüm javac görevleri Ant derlemenizden etkilenecektir. Bunu "org.eclipse.jdt.core.JDTCompilerAdapter" olarak ayarlayabilirsiniz. Ant yapı sınıf yolunuza bu sınıfı (ve buna bağlı olarak sınıfları) eklemeniz gerekeceğini unutmayın. en basit yolu, Ant tesisatın lib klasörüne gerekli kavanoz eklemektir

  3. maven yapılandırmak ile pom oluşumunu bölümünün eklentileri bölümünde bu

     <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> 
    

bina .xml

2

Önce devreye girmesi beklenen yöntemin tam imza belirtmeliyiz geçerli:

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

Ve her ikisi de javac ve Eclipse bu 'Tür güvenliği' sorunu hakkında uyarmak yok. Ve imzayı beklenen gibi değiştirirseniz, javac mutlu olur.

hatta çiğ Object türünü kullanmak imzasıyla, yöntemin toArray bir @Override koyarsanız

Eclipse hem de javac doğru Collection tarafından ilan yönteminin geçersiz kılma olarak görüyoruz. Yani bu konu orada değil. <T> T[] toArray(T[] a) uygulamak

tutarsızlık ve ben javac ait böcek, herhangi alt sınıf uygulamasıdır olduğunu düşünüyorum javac süper yöntem Object[] toArray(Object[] o) tanımıyor. Soyut sınıf için yaptıysa, her alt sınıf için de yapmalıyım.

İlk defa javac'un bu konuda bir sorunu yok. Örneğin, bu thread'a bakın. Oracle hata veri tabanını aradım, bulduğun şey hakkında hiçbir şey bildirmedim.

Ardından bir çalışma var: abstrcat sınıfında, beklenen imzayı kullanın; Ya subclasss içinde geçersiz kılma 'manually` yapın: Tutulma ince derler ve Javac ulaşamadığı yerlere

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