2013-09-25 15 views
8
public interface Expression { 

} 

public interface ArithmeticExpression extends Expression { 

} 


public class StaticMethodDemo { 
    public static void print(Expression e) { 
    System.out.println("StaticMethodDemo"); 
    } 

    public static List<Expression> convert(
     Collection<? extends Expression> input) { 
    return null; 
} 
} 


public class StaticMethodChild extends StaticMethodDemo { 

    public static void print(ArithmeticExpression e) { 
    System.out.println("StaticMethodChild"); 
    } 

    public static List<ArithmeticExpression> convert(
     Collection<? extends ArithmeticExpression> input) { 
    return null; 
    } 
} 

Yukarıdaki kod java 5'te derlenmiyor ama java 7 değil neden? Java 7'de "İsim çatışması" verir: StaticMethodChild türünün dönüştürülmesi (Toplama) yöntemi, StaticMethodDemo türündeki dönüştürmeyi (Koleksiyon) aynı silme işlemine sahiptir ancak gizlemez "Adı Çarpışma derleme java 7 derlendiğinde derleme hatası ancak java'da düzgün çalışıyor 5

cevap

2

Java, statik yöntemlerin geçersiz kılınmasına izin vermez. Bkz. Why doesn't Java allow overriding of static methods?

Yapabileceğiniz tek şey, bir alt sınıfta statik bir yöntemi gizlemek. Saklanma, ne tür bir nesnenin çağrıldığına değil, ne tür bir sınıfa bağlı olduğu anlamına gelir. Şu anda sorun, alt sınıf yönteminizin resmi olarak aynı imzası vardır, ancak genel türleri nedeniyle gizlenmiyordur. Collection<? extends ArithmeticExpression>, ne doğru ne de doğru olmayan gizlemeyi pratik olarak önleyen Collection<? extends Expression>'un bir alt türü değildir. Ayobi'nin belirttiği gibi, derleyici kuralı geriye dönük uyumluluğun sağlanması için getirildi: Method has the same erasure as another method in type

Şu an için kendim denemiyorum, ancak her ikisi de aynı genel türlere sahip olduğunda hata ihmal edilmelidir. Her ne kadar Java 5'de neden bir hata oluşmadığı hakkında hiçbir fikrim olmamasına rağmen, sanırım daha önce bu derleyici kuralını daha sonraki bir sürümde tanıttılar çünkü daha önce fark etmediler.

+0

Açıklama için teşekkür ederiz. Şu anda, Java 7'ye geçiş yaptığımız ve çok sayıda sınıfın bu soruna sahip olduğu bir proje üzerinde çalışıyorum. Bunun dışında, farklılıkları olan yöntemlerle de sorun yaşıyorum. – Dragon

+0

Hataların kaynağı olduğu için bu sınıfları kesinlikle yeniden düzenlemelisiniz. –

4

stonedsquirrel'in yanıtının yanı sıra, yöntemler statik olmasa bile, aynı hatayı alırsınız.

Bu, Tür Silme nedeniyle, uyumsuz bir türle dönüştürmeyi geçersiz kılmaya çalışıyor olmanızdır.

Güzel bir açıklama için aşağıdaki answer'a bakın.

+0

Diğer bağlantılı yanıt, OP ile aynı hata için değil, diğer cevaplar tür silme hakkında iyi konuşur, ancak statik yöntemlere ve "gizlemeyen" hatanın anahtar parçasına başvurmaz. –